Java反射获取私有⽅法
通常我们创建⼀个类时,它的私有⽅法在类外是不可见的,但是可以通过反射机制来获取调⽤。具体的反射机制的介绍⼤家⾃⼰百度。
java反射获取父类属性
所以反射可能会破坏我们的单例模式,当然解决⽅案也是有的,就是做个标记记录次数,第⼆次调⽤私有构造器的时候抛出异常就可以了。这⾥就不详细说明了。
⾸先我们创建⼀个需要被反射的类Person.java。它有默认构造器和带参数构造器,以及私有⽅法。
st;
/**
* @program: java数据结构
* @description: ⼈类
* @author: Wu Lei
* @create: 2018-10-25 09:58
*/
public class Person {
private int age;
private  String name;
public Person(){};
public Person(int age, String name){
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void  say(){
System.out.println("你好啊!公有⽅法!");
}
private void say2(){
System.out.println("你好啊!私有⽅法!");
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
创建⼀个测试类:
st;
import flect.Constructor;
import flect.Field;
import flect.Method;
/**
* @program: java数据结构
* @description: java反射demo
* @author: Wu Lei
* @create: 2018-10-25 09:58
*/
public class ReflectionTest {
public static void main(String[] args) {
Class clazz = Person.class;
Field [] fields =DeclaredFields();
System.out.println("获取到的字段数组:");
for(Field f : fields){
System.out.String());
}
try {
Person p = (Person) wInstance();//调⽤默认构造⽅法
p.setAge(15);
p.setName("test");
System.out.println("调⽤默认的构造⽅法:");
System.out.String());
Constructor constructor = DeclaredConstructor(int.class,String.class);//获取指定参数类型的构造函数            Person p2 = (Person) wInstance(13,"xiaoming");
System.out.println("调⽤指定参数类型的构造⽅法:");
System.out.println(p2);
Method  method = DeclaredMethod("say2");//获取指定⽅法,包括私有⽅法
method.setAccessible(true);//获取私有权限
method.invoke(p2);
Method method1 = Method("say");//获取有权限的⽅法,包括⽗类的
method1.invoke(p);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Method的setAccessible()⽅法可以绕过私有的安全检查,所以我们就可以调⽤类的私有⽅法啦。