前言:
2. 用privite修饰的方法还是属性为了线程安全,在其他类中都不能访问,所以我们就想要获取怎么办,这里运用到了Java中的反射机制。
正文:
非常简单,我们举三个例子。
第一,获取私有的构造方法;
第二,获取私有的方法;
第三,获取私有的属性;
演示
第一,获取私有的构造方法;
先看这个类,有一个私有的带参数方法,我们可以先 获取这个类
1.怎么获取类
有三个方法,
第一种方法.通过getClass获取Class对象
Student s1 = new Student();
Class c1 = s1.getClass();
第二种方法直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高 这说明任何一个类都有一个隐含的静态成员变量 class
Class c3 = null;
try {
//注意这里是类的全路径,如果有包需要加包的路径
c3 = Class.forName("Student");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
我其实推荐后两者,第一种太麻烦了;
2.获取类以后,然后再利用一个好东西,getDeclaredConstructor();获取私有的构造方法
括号里面传的参数类型
比如咱们的构造方法是这个,我们在括号里面传的就是
getDeclaredConstructor(String,int)
错误,不能这么写,记住!!!
要这么写
后面必须有Class的后缀
这一步很关键,不然会报错
其次你就可以传你要传的参数了
public static void reflect1() {
//首先获取类名
Class<?> c1 = Student.class;
try {
//然后用construct进行获取构造方法
Constructor<?> constructor = c1.getDeclaredConstructor(String.class, int.class);
//然后设置为True
constructor.setAccessible(true);
//然后传入参数
Student student = (Student) constructor.newInstance("李华志", 19);
System.out.println(student);
} catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
第二,获取私有的方法
首先,和上面一样,我们要先获取类
然后利用getDeclaredMethod(String name, Class...<?> parameterTypes)这个函数来获取
然后在设置访问权限
最后再实例化一个对象,就可以用invoke调用这个方法了
全部代码如下
//获取私有的方法
public static void reflect3() {
//首先肯定要先获取类名
try {
Class<?> c3 = Class.forName("TestDome.Student");
//设置访问权限
Method method = c3.getDeclaredMethod("display2", String.class);
method.setAccessible(true);
Student student = (Student) c3.newInstance();
method.invoke(student, "LIHUAZHI");
} catch (ClassNotFoundException | InvocationTargetException | InstantiationException | IllegalAccessException | NoSuchMethodException e) {
e.printStackTrace();
}
}
最后老铁们,获取私有属性
我们利用
总结
写到最后福利送上