反射的使用

1、获取类的三种方式

1、  Class.forName("com.yyds.reflect.entity.User");
2、  User.class
3、  New User().getClass();

2、获取构造函数

1、 getDeclaredConstructors();   //获取所有的构造函数
2、 getDeclaredConstructor(Class<?>... parameterTypes); // 获取一个所有的构造函数, 参数为构造方法的参数类型
3、 getConstructors();    //获取所有公开的构造函数
4、 getConstructor(Class<?>... parameterTypes); //获取单个公开的构造函数, 参数为构造方法的参数类型

3、 获取修饰符

getModifiers();         //获取所有修饰符, 返回整数类型,如果有两个类型,则返回两个类型之和, 整数定义:
0 - 默认不写
1–public
2–private
4–protected
8–static
16–final
32–synchronized
64–volatile
128–transient
256–native
512–interface
1024–abstract

4、 获取名字

1、 getName();     // 返回全限定类名,
2、 getSimpleName();    //返回类名

5、获取包

Package package = clz.getPackage();     

6、获取接口

Class[] interfaces = clz.getInterfaces();

7、 获取父类/超类

Class superclass = clz.getSupperclass();

8、获取方法

Method[] methods = clz.getMethods(); //获取所有公开的方法
for(Method method: methods){
    system.out.println(method.getName());
}
Method method = clz.getMethod("earnMoney");   //获取单个的公开方法
method.invoke(clz.newInstance(), null);
Method[] methods = clz.getDeclaredMethods();     //获取所有方法
for(Method method:methods) {
  System.out.println(method.getName();  
}
Method method = clz.getDeclaredMethod("earnMoney");    //获取当个所有的方法
Systemctl.out.println(method.getName());

9、 获取公开字段

1、 clz.getFields();         //获取所有公开字段
2、 clz.getField(String name);         //参数可以指定字段,获取单个public 字段
3、 clz.getDeclaredFields();     //    获取所有的字段
4、clz.getDeclareField(String name):     //获取单个字段,参数可以指定字段

10、 实例化对象

1、cl.newInstance();        //创建一个无参User对象
2、clz.getDeclaredConstructor().newInstance();    //创建一个User对象

11、 设置访问属性

1、 clz.setAccessible(true);            //可以访问
2、 clz.setAccessible(false);            //不可以访问
3、 Field name = clz.getField("userName"); //userName字段
        name.setAccessible(true);   //设为可访问
        name.setAccessible(false);    //设为不可访问

12、 使用方法

1、 Method method = clz.getMethod("earnMoney");
2、 method.invoke(clz.newInstance(), null);  //使用方法,null可不写

 

 

示例:

@SpringBootTest
@Slf4j
public class ClassTest {

    @Test
    public void classTest() throws ClassNotFoundException, InstantiationException, IllegalAccessException,
            NoSuchMethodException, InvocationTargetException {
        // 获取class 对象的三种方式
        log.info("根据类名: " + User.class);
        log.info("根据对象: " + new User().getClass());
        log.info("根据全限定类名:  " + Class.forName("com.yyds.reflect.entity.User"));

        // 常用方法
        Class userClass = User.class;
        log.info("获取全限定类名: " + userClass.getName());
        log.info("获取类名: " + userClass.getSimpleName());
        log.info("实例化: " + userClass.newInstance());
        log.info("有参构造实例化: " + userClass.getConstructor(String.class, String.class, String.class).newInstance("admin", "123456", "beijing"));;

        log.info("有参构造的修饰符" + userClass.getConstructor(String.class, String.class, String.class).getModifiers());

        log.info("获取所有方法"  + userClass.getMethods());
        log.info("获取所有字段"  + userClass.getFields());
    }

}

结果:

 

posted @ 2022-08-08 16:51  长弓射大狗  阅读(41)  评论(0编辑  收藏  举报