创建实体类
class User {
private String name;
private int id;
private int age;
public User() {
}
public User(String name, int id, int age) {
this.name = name;
this.id = id;
this.age = age;
}
private void testUser() {}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", id=" + id +
", age=" + age +
'}';
}
}
通过反射创建对象并获取对应的属性和方法
public class Test08 {
public static void main(String[] args) {
try {
test();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void test() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
Class c1 = Class.forName("com.sty.reflection.User");
// 1、创建对象
User user = (User) c1.newInstance(); // 本质是调用了类的无参构造器
System.out.println(user);
// 2、通过构造器创建对象
Constructor constructor = c1.getDeclaredConstructor(String.class, int.class, int.class);
user = (User) constructor.newInstance("玲玲", 1, 18);
System.out.println(user);
/**
* 通过反射调用普通方法
* invoke (激活的意思),参数为:(对象,方法的值)
*/
Method setName = c1.getMethod("setName", String.class);
setName.invoke(user, "呼呼");
System.out.println(user.getName());
// 通过反射操作属性
Field age = c1.getDeclaredField("age");
// 不能直接操作私有属性,可以通过关闭成熟的安全检查,属性或方法通过设置 .setAccessible(true) 关闭
age.setAccessible(true);
age.set(user, 81);
System.out.println(age.get(user));
}
}
执行的结果为:
User{name='null', id=0, age=0}
User{name='玲玲', id=1, age=18}
呼呼
81
如何通过反射改变私有属性和方法
// 不能直接操作私有属性,可以通过关闭成熟的安全检查,属性或方法通过设置 .setAccessible(true) 关闭
age.setAccessible(true);
知识来源
标签:反射,name,int,age,创建对象,id,User,public,属性 From: https://www.cnblogs.com/styCy/p/17158894.html