java反射-重点内容

一,反射机制作用:

  1. 可以操作字节码文件,使程序更加灵活

二,反射机制常用类:

  1. java.lang.Class:代表整个字节码,代表一个类型,代表整个类。
  2. java.lang.reflect.Method:代表字节码中的方法字节码。代表类中的方法。
  3. java.lang.reflect.Constructor:代表字节码中的构造方法字节码。代表类中的构造方法
  4. java.lang.reflect.Field:代表字节码中的属性字节码。代表类中的成员变量(静态变量+实例变量)

三,获取javaClass实例的方式:

  1. Class c = Class.forName("完整类名带包名")
  2. Class c = 对象.getClass()
  3. Class c = 任何类型.class

四,反射机制的具体功能:

public class User{
    public String name;
    private int password;
    public User() {
    }
    public User(String name, int password) {
        this.name = name;
        this.password = password;
    }
    public boolean login(String name, int password){
        return "admin".equals(name) && password == 123456;
    }
}

1.通过反射机制访问对象的某个属性

public class Reflect01 {
    public static void main(String[] args) throws Exception {
        //使用反射机制获取一个类的Class实例
        Class<?> userClass = Class.forName("com.lv.reflect.User");
        //通过这个类的Class创建类的实例化对象,底层调用了无参数构造方法,obj就是User对象
        Object obj = userClass.newInstance();

        //访问公有属性
        //根据属性名来获取属性的Field实例
        Field name = userClass.getDeclaredField("name");
        //给obj对象的name属性赋值为张三
        name.set(obj,"admin");
        //获取obj的那么属性值并输出
        System.out.println(name.get(obj));

        //访问私有属性
        Field age = userClass.getDeclaredField("password");
        //需要增加一步打破封装,这样设置后,在外部也可以访问private的,可能给不法分子留下机会
        age.setAccessible(true);
        age.set(obj,123456);
        System.out.println(age.get(obj));
    }
}

2.通过反射机制调用对象的某个方法

public class Reflect02 {
    public static void main(String[] args) throws Exception {
        //使用反射机制获取一个类的Class实例
        Class<?> userClass = Class.forName("com.lv.reflect.User");
        //通过这个类的Class创建类的实例化对象,底层调用了无参数构造方法,obj就是User对象
        Object obj = userClass.newInstance();
        //通过方法名获取这个方法的Method实例
        Method login = userClass.getMethod("login", String.class, int.class);
        //执行obj对象的login方法,并传入参数,获取返回结果
        Object result = login.invoke(obj, "admin", 123456);
        System.out.println((boolean)result?"登录成功":"登录失败");
    }
}

3.通过反射机制调用某个构造方法实例化对象

public class Reflect03 {
    public static void main(String[] args) throws Exception{
        //使用反射机制获取一个类的Class实例
        Class<?> userClass = Class.forName("com.lv.reflect.User");
        //通过这个类的Class创建类的实例化对象,底层调用了无参数构造方法,obj就是User对象
        Object obj = userClass.newInstance();

        //获取有参数的构造方法
        Constructor<?> con = userClass.getDeclaredConstructor(String.class, int.class);
        //用构造方法创建实例对象
        Object o1 = con.newInstance("admin", 123456);
        System.out.println(o1);

        //获取无参数的构造方法
        Constructor<?> con2 = userClass.getConstructor();
        Object o2 = con2.newInstance();
        System.out.println(o2);
    }
}

4.通过反射机制获取父类以及父类型接口

public class Reflect04 {
    public static void main(String[] args) throws Exception{
        // 获取String类的Class实例
        Class<?> stringClass = Class.forName("java.lang.String");
        // 通过Class实例获取String的父类
        Class<?> superClass = stringClass.getSuperclass();
        System.out.println(superClass.getName());
        // 通过Class实例获取String类实现的所有接口(一个类实现的接口可以有多个)
        Class<?>[] interfaces = stringClass.getInterfaces();
        for(Class<?> in : interfaces){
            System.out.println(in.getName());
        }
    }
}
posted @ 2021-12-16 11:39  从0开始丿  阅读(43)  评论(0编辑  收藏  举报