Flask接口签名sign原理与实例代码浅析
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~