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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java 利用反射机制,获取实体所有属性和方法,并对属性赋值

    一个普通的实体Person: private int id; private String name; private Date createdTime; ... //其它字段 // get set方法 ............... 现在需要把通过webService传过来的实体Person里面的所有字段的null值,换成"" 实现思路: 1.获取实体的所有字段,遍历 2.获取字段类型 3.调用字段的get方法,判断字段值是否为空 4.如果字段值为空,调用字段的set方法,为字段赋值

  • Java反射(Class类,Class对象获取)

    目录 Java反射超详解 1.反射基础 1.1Class类 1.2类加载 2.反射的使用 2.1Class对象的获取 2.2Constructor类及其用法 2.3Field类及其用法 Java反射超详解 1.反射基础 Java反射机制是在程序的运行过程中,对于任何一个类,都能够知道它的所有属性和方法:对于任意一个对象,都能够知道它的任意属性和方法,这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制. Java反射机制主要提供以下这几个功能: 在运行时判断任意一个对象所属的类

  • Java中反射详解

    阅读目录 Java反射API 通过反射创建实例对象 通过反射调用私有方法 关于javap工具 参考资料 Java反射API Java反射指的是在运行状态时,能够获取类的属性和方法或者修改类运行时行为的过程. java.lang.Class类提供了很多方法用于获取元数据.检查和改变类运行时的行为. Java的反射主要涉及java.lang和java.lang.reflect包下的类. 反射应用场景举例 IDE, 如Eclipse.MyEclipse.NetBeans等: 调试器: 测试工具等: 各

  • java中的反射应用实现

    反射 我们先创建一个Student类出来.注意类中的成员变量.构造方法.成员方法公共还是私有 package com.reflect; public class Student { //成员变量 public String name;//公共 private int age;//私有 //构造方法 public Student() { super(); // TODO Auto-generated constructor stub } //私有构造方法 private Student(Strin

  • Java如何通过反射获取Constructor、Field、Method对象

    目录 前言 使用反射技术获取构造器对象并使用 使用反射技术获取成员变量对象并使用 使用反射技术获取方法对象并使用 总结 前言 在实际开发中,通过反射可以得到一个类的完整结构,包括类的构造方法.类的属性.类的方法,这就需要使用到java.lang.reflect包中的以下几个类: 1.Constructor:表示类中的构造方法 2.Field:表示类中的属性 3.Method:表示类中的方法 使用反射技术获取构造器对象并使用 实验类: public class 反射机制_2实验类 { privat

  • java中如何反射获取一个类

    反射说白了就是可以获得一个类的所有信息,主要包括方法和属性两部分. 1.获得方法包括获得方法的名称,方法的返回类型,方法的访问修饰符,以及通过反射执行这个方法. 2.获得属性包括属性的名称,类型,访问修饰符,以及这个属性的值. 这些获得都有相应的API提供操作. 代码如下: package poi; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Meth

  • java发起http请求获取返回的Json对象方法

    话不多说,先看代码! /** * Created by david on 2017-7-5. */ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import ja

  • c++获取sqlite3数据库表中所有字段的方法小结

    常用方法: 1.使用sqlite3_get_table函数 2.获取sqlite创建表的sql语句字符串,然后进行解析获取到相应的字段 3.采用配置文件的方式,将所有字段名写入配置文件 下面针对这三个方法给大家逐一详细介绍. 方法1:使用sqlite3_get_table函数 代码: char *dbname = "test.db"; int rc = sqlite3_open(dbname, &db); if (rc == SQLITE_OK) { char sql[256]

  • 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: &quo

  • Java如何基于反射获取对象属性信息

    先建立一个类,有四种属性: private int id; private String name; private byte by; private short st; 以下方法,创建一个对象,然后打印该对象的属性名字,属性值,和属性的类型: public class T { public static void main(String[] args) throws Exception { User u = new User(); u.setId(1); u.setName("cc"

  • 利用反射获取Java类中的静态变量名及变量值的简单实例

    JAVA可以通过反射获取成员变量和静态变量的名称,局部变量就不太可能拿到了. public class Test { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub //获取所有变量的值 Class clazz = Class.forName("com.qianmingxs.ScoreTable"); Field[] fields = clazz.g

  • Java深入分析讲解反射机制

    目录 反射的概述 获取Class对象的三种方式 通过反射机制获取类的属性 通过反射机制访问Java对象的属性 反射机制与属性配置文件的配合使用 资源绑定器 配合使用样例 通过反射机制获取类中方法 通过反射机制调用Java对象的方法 通过反射机制获取类中的构造方法 通过反射机制创建对象(调用构造方法) 通过反射机制获取一个类的父类和父接口 反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的

  • Java 全面系统介绍反射的运用

    目录 反射 反射定义 反射的基本运用 1.获取类对象 a.forName()方法 b.直接获取 c.getClass()方法 d.getSystemClassLoader().loadClass()方法 2.获取类方法 a.getDeclaredMethods b.getDeclaredMethod c.getMethods d.getMethod 3.获取成员变量 a.getDeclaredFields b.getDeclaredField(Stringname) c.getFields()

随机推荐