Java如何通过反射获取私有构造、私有对象、私有字段、私有方法

Java反射获取私有构造、私有对象、私有字段、私有方法 1. 创建测试的私有对象

/** * @author lirong * @desc 测试对象 * @date 2019/06/20 20:07 */public class Person {private int age = 5; private String name; private Person(){}private String test(String name){System.out.println("name: "+name); return "test"; }}

2. 获取私有对象中的属性和方法
/** * @author lirong * @desc 反射获取私有属性和方法 * @date 2019/06/20 20:10 */public class Test {public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {// 1. 获取class对象Class clazz = Person.class; // 2. 获取私有无参构造Constructor c = clazz.getDeclaredConstructor(); // 3. 设置访问为可见c.setAccessible(true); // 4. 通过构造器创建实例对象Person person = (Person) c.newInstance(); // 根据字段名称获取class中的字段Field age = clazz.getDeclaredField("age"); age.setAccessible(true); System.out.println(age.getName() + " = " + age.get(person)); // 修改私有变量的默认值age.set(person, 18); System.out.println(age.getName() + " = " + age.get(person)); // 5. 获取所有字段Field[] fields = clazz.getDeclaredFields(); for (Field f : fields) {// 设置字段的可见性f.setAccessible(true); String name = f.getName(); Object o = f.get(person); System.out.println(name + " - " + o); }// 6. 获取所有的方法Method[] methods = clazz.getDeclaredMethods(); for (Method m : methods) {m.setAccessible(true); String name = m.getName(); Object invoke = m.invoke(person, "张三"); System.out.println(name + " = "+invoke); }}}

通过反射获取私有内部类对象 首先是我们的目标对象:
class Out {//目标获取Inner对象private class Inner {//内部类的私有成员属性private String inner = "ccc"; }}

直接列出代码
public class Main {@SuppressWarnings({ "rawtypes", "unchecked" })public static void main(String[] args) throws Exception {//获取外部类Class clzz = Out.class; //获取外部类默认无参构造方法Constructor con = clzz.getDeclaredConstructor(); //实例一个外部类对象Out outObj = (Out) con.newInstance(); //获取外部类内的所有内部类Class innerClazz[] = clzz.getDeclaredClasses(); //遍历for (Class c : innerClazz) {//获取修饰符的整数编码int mod = c.getModifiers(); //返回整数编码对应的修饰符的字符串对象String modifier = Modifier.toString(mod); //找到被private修饰的内部类if (modifier.contains("private")) {//根据内部类的特性,需要由外部类来反射获取内部类的构造方法(这里获取的是内部类的默认构造方法)Constructor cc = c.getDeclaredConstructor(clzz); //由于内部类是私有的,需要强制获取构造方法的访问权限cc.setAccessible(true); //由外部类对象来反射获取内部类的对象Object obj=cc.newInstance(outObj); //获取内部类的私有成员属性innerField f=c.getDeclaredField("inner"); //获取访问权限f.setAccessible(true); //获取内部类对象obj中的私有成员属性inner的值System.out.println(f.get(obj)); }}}}

【Java如何通过反射获取私有构造、私有对象、私有字段、私有方法】输出结果:
ccc
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    推荐阅读