java反射的初步探索
2021-02-13 15:20
标签:无法 vat color equals out col nbsp for cte reflect包中的Class类(注意是大写C)——类型标识类-Class import java.lang.reflect; 反射reflection:程序可以访问、检测和修改它本身状态或行为的能力,即自描述和自控制。 可以在运行时加载、探知、使用编译期间完全未知的类 可以在运行时查看和操作对象:基于反射自由创建对象、set或get无法访问的成员变量、调用不可访问的方法等 即,可以通过“反射”获得类的所有信息,比如 1.Field:成员变量/属性 2.Method:成员方法类 这里的m.setAccessble(true);只是临时把private/protected方法变成了private不影响B类中其他对象,其new新的B类对象时, f2方法仍是不可见的 **************************************** 注:类名.class 和类名.getClass()方法是一样的 java反射的初步探索 标签:无法 vat color equals out col nbsp for cte 原文地址:https://www.cnblogs.com/li7anStrugglePath/p/12726791.html 1 class A{
2 public int age;
3 private String name;
4
5 //A的构造函数
6 public A(int age, String name)
7 {
8 this.age = age;
9 this.name = name;
10 }
11
12 A obj = new A(20, "li7an");
13 Class c = obj.getClass();//得到类型标识
14
15 //获取本类及父类所有的public属性
16 Field[] fs = c.getFields();
17
18 //获取本类自己声明的所有public/protected/default/private属性
19 Field[] fs2 = c.getDeclaredFields();
20 for(Field f: f2)
21 {
22 f.setAccessible(true);//这个方法使得protected/private属性也可调用,临时都变为public的
23 }
class B{
public void f1(){
out.println("B.f1()");
}
private String f2(String s){
out.println("B.f2()")
return s;
}
B obj = new B();
Class c = obj.getClass();
//获取public方法
Method[] ms = c.getMethods();
for(method m:ms){
if("f1".equals(m.getName())){
m.invoke(obj, null);//反射中调用某个方法时,用invoke方法,此时必须传入一个对象如这里的“obj”后才能调用
}
}
//获得该类的所有方法
Method[] ms2 = c.getDeclaredMethods();
for(Method m:ms2){
if("f2".equals(m.getName())){
m.setAccessible(true);//又来啦
String result = (String)m.invoke(obj,"abc");
out.println(result);
}
}