唐僧喜欢小龙女

导航

利用反射 获取类的 私有属性 私有方法 私有构造器 私有的静态方法

1、Person 类

public class Person {
private String name;
public int age;

public Person() {
}
private static String getNames(String name){
return name;
}

public Person(String name, int age) {
this.name = name;
this.age = age;
}

private Person(String name){
this.name = name;
}
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 void show(){
System.out.println("你好 我是个好人");
}

private String showNation(String nation){
System.out.println("我的国籍是"+ nation);
return nation;
}

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
2、测试 类

public class Relection {
@Test
public void test1() throws Exception{
Class calzz = Person.class;
//通过反射获取构造器 public
Constructor constructor = calzz.getConstructor(String.class,int.class);
Object obj = constructor.newInstance("tom",24);
Person p = (Person)obj;
System.out.println(p.toString());
//通过反射获取属性 给public属性赋值。
Field age = calzz.getDeclaredField("age");
age.set(p,34);
System.out.println(p.toString());
//通过反射获取pubic方法 这里得到 方法名是show的方法 并且show方法没有形参
//如果show方法有形参需要加上形参
Method show =calzz.getDeclaredMethod("show");
show.invoke(p);
System.out.println("**************************************");
//通过反射可以获取 Person类的私有 构造器 私有 属性 私有 方法
//获取 私有的构造器
Constructor constructor1 = calzz.getDeclaredConstructor(String.class);
constructor1.setAccessible(true);
Person person = (Person) constructor1.newInstance("jack");
System.out.println(person.toString());
//调用私有的属性
Field name = calzz.getDeclaredField("name");
name.setAccessible(true);
name.set(person,"hanmeimei");
System.out.println(person.toString());

//调用私有的方法
Method showNation = calzz.getDeclaredMethod("showNation", String.class);
showNation.setAccessible(true); //invoke 是调用的意思
String nation = (String) showNation.invoke(person,"中国");
System.out.println(nation);
//调用私有静态的
Method getName = calzz.getDeclaredMethod("getNames",String.class);
getName.setAccessible(true);
String n = (String) getName.invoke(person,"高河强");
System.out.println("静态的方法"+n);

//总结 通过反射可以获得 类的属性方法 构造器 无论是 私有的 还是 public 的 私有静态的也可以

Person{name='tom', age=24}
Person{name='tom', age=34}
你好 我是个好人
**************************************
Person{name='jack', age=0}
Person{name='hanmeimei', age=0}
我的国籍是中国
中国
静态的方法rose




posted on 2019-11-19 14:05  与时具进&不忘初心  阅读(705)  评论(0编辑  收藏  举报