实现反射,获取Class对象的三种方式:
// 方法一
User user = new User();
Class class1 = user.getClass();
// 方法二
Class<User> class2 = User.class;
// 方法三
try {
Class class3 = Class.forName("test.User");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
从上面的运行结果可以看出来,在运行期间一个类只会产生一个 Class 对象。
通过方射获取类信息:
获取 User 类的变量:
public class User {
public Long id;
protected String name;
String sex;
private Integer age;
}
定义四个不同访问权限的变量。
访问权限
当前类
同一包
子类
其他包
权限修饰词:public
✔
✔
✔
✔
权限修饰词:protected
✔
✔
✔
×
默认
✔
✔
×
×
权限修饰词:private
✔
×
×
×
获取公有的变量:getFields
Class userClass = Class.forName("test.User");
Field[] fields = userClass.getFields();
for(int i = 0; i < fields.length; i++) {
System.out.println(fields[i]);
}
获取所有的变量:getDeclaredFields
Class userClass = Class.forName("test.User");
Field[] fields = userClass.getDeclaredFields();
for(int i = 0; i < fields.length; i++) {
System.out.println(fields[i]);
}
调用:
在User中定义一个默认的构造方法:
public User() {
this.id = 1L;
this.name = "张三";
this.sex = "男";
this.age = 18;
}
获取公有变量:
Field field = userClass.getField("id");
Object object = userClass.getConstructor().newInstance();
field.set(object,1234L);
User user = (User)object;
System.out.println(user.getId());

获取私有变量:
这样发现会报错,无法访问私有变量。
加上field.setAccessible(true);
Field field = userClass.getDeclaredField("age");
Object object = userClass.getConstructor().newInstance();
field.setAccessible(true);
field.set(object,22);
User user = (User)object;
System.out.println(user.getAge());
构造方法:
获取公有构造方法:
获取所有构造方法:
public User() {
this.id = 1234L;
this.name = "张三";
this.sex = "男";
this.age = 18;
}
private User(String name) {
this.name = name;
}
调用:
Class userClass = Class.forName("test.User");
// 私有
Constructor privateCon = userClass.getDeclaredConstructor(String.class);
privateCon.setAccessible(true);
User priUser = (User) privateCon.newInstance("aaaa");
System.out.println(priUser.getName());
// 公有
Constructor publicCon = userClass.getConstructor();
User pubUser = (User) publicCon.newInstance();
System.out.println(pubUser.getName());

普通方法:
获取公有方法:
获取所有方法:
public User() {
this.id = 1234L;
this.name = "张三";
this.sex = "男";
this.age = 18;
}
// 私有
private void getAge() {
System.out.println(age);
}
// 公有
public void getName() {
System.out.println(name);
}
调用:
public static void main(String[] args) {
try {
Class userClass = Class.forName("test.User");
// 创建新实例
Object obj = userClass.getConstructor().newInstance();
// 公有
Method m1 = userClass.getMethod("getName");//参数1:方法名
m1.invoke(obj);
// 私有
Method m2 = userClass.getDeclaredMethod("getAge");//参数1:方法名
m2.setAccessible(true);//解除私有
m2.invoke(obj);
} catch (Exception e) {
e.printStackTrace();
}
}
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。