创建反射对象
// 第一种创建方法
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():调用方法