反射

创建反射对象

// 第一种创建方法
User user = new User;
Class c = user.getClass();
// 第二种创建方法
Class c2 = User.getClass();
// 第三种创建方法(推荐)
Class c3 = Class.forName("com.kgc.j341.keshang001.User");

// 通过反射调用无参构造创建字节码类User的对象
// Java 9之后被废弃
User user = (User) c3.newInstance();
// 可用此方法代替
User user = (User) c1.getDeclaredConstructor().newInstance();


public class User {
    private String name;
    private int age;
    private String sex;
    public User() {
    }
    private User(String name) {
        this.name = name;
    }
    public User(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    private void show() {
        System.out.println("User [name=" + name + "\t, age=" + age+ "\t, sex=" + sex + "\t]");
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + ", sex=" +sex + "]";
    }
}
  • Constructor: 构造方法
  • Method:普通方法
  • Field:属性

调用字节码类中的构造方法

// 获取字节码对象
Class clazz = Class.forName("cn.kgc.j341.keshang023.User");
// 调用有参构造实例化对象
User user = (User) clazz.getConstructor(String.class, 
            int.class, String.class).newInstance("张三", 18, "男");
System.out.println(user);
// 调用私有的构造方法实例化对象
Constructor constructor =clazz.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
System.out.println(constructor.newInstance("李四"));

调用一般方法

// 获取class文件对应的字节码对象(Class对象)
Class c1 = Class.forName("cn.kgc.j341.keshang023.User");
// 通过反射机制调用无参构造创建对象
User user = (User) c1.getDeclaredConstructor().newInstance();
System.out.println(user.toString());
// 获取反射对象类中的toString方法
Method m1 = c1.getDeclaredMethod("toString");
// 通过invoke()操作一般方法
System.out.println(m1.invoke(user));
Method m2 = c1.getDeclaredMethod("show");
// 如果方法是私有方法需要使用setAccessible()方法开启私有开关才能进行操作
    m2.setAccessible(true);
// 通过invoke()操作一般方法
    m2.invoke(user);
System.out.println("***********************************");
// 操作有参方法                               参数类型
Method m3 = c1.getDeclaredMethod("setName", String.class);
            m3.invoke(user, "张三");
       m3 = c1.getDeclaredMethod("setAge", int.class);
            m3.invoke(user, 18);
       m3 = c1.getDeclaredMethod("setSex", String.class);
            m3.invoke(user, "男");
System.out.println(m1.invoke(user));

获取属性

Class clazz = Class.forName("cn.kgc.j341.keshang023.User");
User user = (User) clazz.getDeclaredConstructor().newInstance();
// 获取属性
Field field = clazz.getDeclaredField("age");
// 打开私有化
field.setAccessible(true);
// 为属性赋值
field.set(user, 18);
System.out.println(user);

方法

  • getDeclaredConstructor():获取反射对象的构造方法
  • getConstructor():获取非私有化的反射对象的构造方法
  • newInstance():实例化对象
  • getDeclaredField():获取属性
  • getField():获取非私有化的属性
  • getDeclaredMethod():获取一般方法
  • getMethod():获取非私有化的方法
  • set():设置获取的属性值
  • setAccessible():打开私有开关
  • invoke():调用方法

你可能感兴趣的:(反射)