欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

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

时间:2023-01-28 10:34:40|栏目: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);
                //获取内部类的私有成员属性inner
                Field f=c.getDeclaredField("inner");
                //获取访问权限
                f.setAccessible(true);
                //获取内部类对象obj中的私有成员属性inner的值
                System.out.println(f.get(obj));
            }
        }
    }
}

输出结果:

ccc

上一篇:Java中实现汉字生成拼音首拼和五笔码

栏    目:JAVA代码

下一篇:原理分析SonarQube中IdentityProvider账户互斥现象

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

本文地址:http://www.codeinn.net/misctech/224637.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有