GVKun编程网logo

如何通过反射从Java字段获取字符串值?(如何通过反射从java字段获取字符串值数据)

9

本篇文章给大家谈谈如何通过反射从Java字段获取字符串值?,以及如何通过反射从java字段获取字符串值数据的知识点,同时本文还将给你拓展c#–如何通过反射获取类及其父类的私有字段?、JavaSE__通

本篇文章给大家谈谈如何通过反射从Java字段获取字符串值?,以及如何通过反射从java字段获取字符串值数据的知识点,同时本文还将给你拓展c# – 如何通过反射获取类及其父类的私有字段?、Java SE__通过反射创建类并通过反射执行实例方法、Java如何通过反射获取非静态内部类、Java字符串不变性和使用相同的字符串值创建新的字符串等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

如何通过反射从Java字段获取字符串值?(如何通过反射从java字段获取字符串值数据)

如何通过反射从Java字段获取字符串值?(如何通过反射从java字段获取字符串值数据)

我有一个方法:

public void extractStringFromField(Class<?> classToInspect) {
    Field[] allFields = classToInspect.getDeclaredFields();

    for(Field field : allFields) {
        if(field.getType().isAssignableFrom(String.class)) {
            System.out.println("Field name: " + field.getName());

            // How to get the actual value of the string?!?!
            // String strValue = ???
        }
    }
}

当运行时,我得到如下输出:

Field name: java.lang.String

现在我该怎样提取实际字符串值入strValue使用反射?

c# – 如何通过反射获取类及其父类的私有字段?

c# – 如何通过反射获取类及其父类的私有字段?

我有B类及其父类A,都在命名空间Domain中.

A类,有私人领域a;
B类,有私人字段b;

然后我在命名空间反射中有一个反射Util.
如果我使用这一行

instanceOfB.GetType().GetFields(BindingFlags.NonPublic 
         | BindingFlags.Public | BindingFlags.Instance );

找到所有字段(a& b),我只得到b.但是当我做一个受保护或公开的时候,我也找到了.

我还需要做什么来找到基类的私有领域?

解决方法

这是 documented behaviour:

Specify BindingFlags.NonPublic to include non-public fields (that is,private,internal,and protected fields) in the search. Only protected and internal fields on base classes are returned; private fields on base classes are not returned.

如果您需要获取私人领域,您需要询问基本类型. (使用Type.BaseType查找基本类型,并调用GetFields.)

Java SE__通过反射创建类并通过反射执行实例方法

Java SE__通过反射创建类并通过反射执行实例方法

Java的反射机制可以通过类的信息去创建类,并执行类中的方法。

示例代码:

Reflect_Setter 类

public class Reflect_Setter {
  • public int a;
  • {
  • a = 1;
  • }
  • public int getA() {
  • System.out.println("通过反射调用getA方法");
  • return this.a;
  • }
  • }


  • Set_Function 类

    1. import java.lang.reflect.Method;
    2. public class Set_Function {
    3. public static void main(String[] args) throws Exception,
    4. IllegalAccessException {
    5. Class<?> k = Class.forName("Reflect_Setter");
    6. Object kObject = k.newInstance();
    7. Method kmthod = k.getMethod("getA"); // 如果方法名错误,会抛出NoSuchMethodException异常
    8. int obj = (int) kmthod.invoke(kObject);
    9. System.out.println("通过反射创建Reflect_Setter类实例,并通过反射调用实例的getA方法,得到的A的值为"
    10. + obj);
    11. }
    12. }






    Java如何通过反射获取非静态内部类

    Java如何通过反射获取非静态内部类

    一、无参构造函数

    /**
     *  反射内部类
     * @author zhangyu
     * @date 2022/1/8
    */
    public class OuterClass {
    
        public void process() {
            System.out.println("外部类方法...");
        }
    
        class InnerClass {
            public void process() {
                System.out.println("内部类方法...");
            }
        }
    }
    登录后复制

    【1】获取内部类对象需要依赖外部类的对象

    【2】通过Class获取内部类可以通过俩种方式

    【3】实例化类需要构造器,反射调用构造器需要设置可访问constructor.setAccessible(true);

    立即学习“Java免费学习笔记(深入)”;

        @Test
        public  void test5() throws InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException, ClassNotFoundException {
            //需要依赖外部类对象实例化内部类
            Class outerClass = Class.forName("reflection.demo.OuterClass");
            Object outerObject = outerClass.newInstance();
            //如果知道外部类下内部类数量,那么通过下面方式即可
            Class<?> innerClass = OuterClass.class.getDeclaredClasses()[0];
            //如果知道内部类全限定名,可以通过下面的方式
            //Class<?> innerClass = Class.forName("full.package.name.OuterClass$InnerClass")
            //获取默认构造器
            Constructor<?> constructor = innerClass.getDeclaredConstructors()[0];
            //也可以通过下面的方式获取构造器
            //Constructor<?> constructor = innerClass.getDeclaredConstructor(OuterClass.class);
            //默认构造器私有的,需要设置可访问
            constructor.setAccessible(true);
            //通过构造器和父类Class创建内部类实例
            Object innerObject = constructor.newInstance(outerObject);
            Method innerClassDeclaredMethod = innerClass.getDeclaredMethod("process");
            innerClassDeclaredMethod.setAccessible(true);
            innerClassDeclaredMethod.invoke(innerObject);
        }
    登录后复制

    二、有参构造函数

    上面描述的是不带参数的构造函数,下面描述下带参数的构造函数

    /**
     *  反射内部类
     * @author zhangyu
     * @date 2022/1/8
    */
    public class OuterClass {
    
        private  String name;
    
        public OuterClass(String name) {
            this.name = name;
        }
    
        public void process() {
            System.out.println("外部类方法...");
        }
    
        class InnerClass {
            private  String name;
    
            public InnerClass(String name) {
                this.name = name;
            }
    
            public void process() {
                System.out.println(name+"----内部类方法...");
            }
        }
    }
    登录后复制
        @Test
        public  void test5() throws InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException, ClassNotFoundException {
            //需要依赖外部类对象实例化内部类
            Class outerClass = Class.forName("reflection.demo.OuterClass");
            Constructor declaredConstructor = outerClass.getDeclaredConstructor(String.class);
            declaredConstructor.setAccessible(true);
            //获取外部类实例以及设置构造函数值
            Object outerObject = declaredConstructor.newInstance("outerClass");
    
            //如果知道外部类下内部类数量,那么通过下面方式即可
            Class<?> innerClass = OuterClass.class.getDeclaredClasses()[0];
            //如果知道内部类全限定名,可以通过下面的方式
            //Class<?> innerClass = Class.forName("full.package.name.OuterClass$InnerClass")
            //获取默认构造器
            Constructor<?> constructor = innerClass.getDeclaredConstructors()[0];
            //也可以通过下面的方式获取构造器
            //Constructor<?> constructor = innerClass.getDeclaredConstructor(OuterClass.class);
            //默认构造器私有的,需要设置可访问
            constructor.setAccessible(true);
            //通过构造器和父类Class创建内部类实例.设置构造函数值
            Object innerObject = constructor.newInstance(outerObject,"innerClass");
            Method innerClassDeclaredMethod = innerClass.getDeclaredMethod("process");
            innerClassDeclaredMethod.setAccessible(true);
            innerClassDeclaredMethod.invoke(innerObject);
        }
    登录后复制

    Java如何通过反射获取非静态内部类

    以上就是Java如何通过反射获取非静态内部类的详细内容,更多请关注php中文网其它相关文章!

    Java字符串不变性和使用相同的字符串值创建新的字符串

    Java字符串不变性和使用相同的字符串值创建新的字符串

    我知道问题的标题不是很清楚,对此感到抱歉,不知道如何提出。我有一个非常基本的Java实现问题,我想着重于应用程序性能,但是它也涉及Java中的String创建模式。

    我了解Java中字符串的不变性概念。我不确定的是,我在某处读到以下内容不会创建两个不同的String对象:

    String name = "Sambhav";
    String myName= "Sambhav";
    

    我想知道Java是怎么做到的?它实际上是否在程序存储器中寻找一个String值并检查其是否存在,如果不存在则创建一个新的String对象?在那种情况下,显然可以节省内存,但存在性能问题。

    还可以说我有这样的代码:

      public void some_method(){
            String name = "Sambhav";
            System.out.println(name); //  or any random stufff
      }
    

    现在,在每次调用此函数时,是否正在创建一个新的String并将其添加到内存中,或者我是否使用相同的String对象?我只是想知道所有事情的真相?

    如果我们这样说

    String name = "Sambhav";
    String myName= "Sambhav";
    

    不会因为引用而创建新对象,那

    String name = new String("Sambhav");
    String myName= new String("Sambhav");
    

    Java是否仍然可以捕捉到该字符串相同,只是将myName指向与上一条语句中创建的对象相同的对象?

    我们今天的关于如何通过反射从Java字段获取字符串值?如何通过反射从java字段获取字符串值数据的分享已经告一段落,感谢您的关注,如果您想了解更多关于c# – 如何通过反射获取类及其父类的私有字段?、Java SE__通过反射创建类并通过反射执行实例方法、Java如何通过反射获取非静态内部类、Java字符串不变性和使用相同的字符串值创建新的字符串的相关信息,请在本站查询。

    本文标签:

    上一篇Java的Double.MIN_NORMAL和Double.MIN_VALUE之间的区别?(java double decimal区别)

    下一篇Django测试客户端访问URL时获得301重定向(django获取访问ip)