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

网友投稿 596 2022-09-09


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;

//获http://取外部类默认无参构造方法

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);

//获取内部类的私有成员属性inner

Field f=c.getDeclaredField("inner");

//获取访问权限

f.setAccessible(true);

//获取内部类对象obj中的私有成员属性inner的值

System.out.println(f.get(obj));

}

}

}

}

输出结果:

ccc


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:虚链路配置实验实列
下一篇:IPV6实验案例(ipv6 test-ipv6)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~