JAVA---反射

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA---反射相关的知识,希望对你有一定的参考价值。

当用到一个类对象的时候,JVM会把此类的Class字节码文件加载到内存中(只加载一次),JVM会此类的信息封装成对象。利用封装好的对象获取类的相关信息进行构造类或者调用方法等,叫做反射。

反射的目的和作用就是为了开发者写出更通用的代码。

  • 把类名称,继承,实现封装成Class对象
  • 把类的构造方法封装成Constructor对象
  • 把类的成员属性封装成File对象
  • 把类的普通方法、返回值封装成Method对象

 

举例

package com.myjava.reflect;

public class Person
{
    private int _age;
    private String _name;

    public int get_age()
    {
        return _age;
    }

    public void say()
    {
        System.out.println(_name + "今年" + _age + "岁了");
    }

    public void set_age(int _age)
    {
        this._age = _age;
    }

    public Person(int _age, String _name)
    {
        super();
        this._age = _age;
        this._name = _name;
    }

    public String get_name()
    {
        return _name;
    }

    public void set_name(String _name)
    {
        this._name = _name;
    }
}

主程序

 

package com.myjava.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

/**
 * @ClassName: ReflectTest
 * @Description: TODO(这里用一句话描述这个类的作用)
 * @author 刘阳阳
 * @date 2016年10月5日 上午9:20:32
 *
 */

public class ReflectTest
{

    public static void main(String[] args)
            throws ClassNotFoundException, NoSuchMethodException,
            SecurityException, IllegalAccessException, IllegalArgumentException,
            InvocationTargetException, InstantiationException

    {
        // 根据类名进行加载,此加载不进行对象构造生成
        Class myClass = Class.forName("com.myjava.reflect.Person");
        // 这个需要导入对应的Person
        // Class myClass = Person.class;
        // 这个是进行实例化后获取对应的类信息
        // Class myClass = new Person(11, "honey").getClass();
        System.err.println(myClass.getName()); // 获取类名称
        Field[] Fields = myClass.getDeclaredFields();// 获取成员字段
        for (Field f : Fields)
        {
            System.err.println(f.getName());// 获取成员名称
            System.err.println(f.getModifiers());// 声明的权限 default private public
                                                 // protected
            System.err.println(f.getType());// 获取成员类型

        }
        Constructor[] constructors = myClass.getDeclaredConstructors();
        for (Constructor con : constructors)
        {
            System.err.println(con.getName());
            System.err.println(con.getModifiers());// 声明的权限 default private
                                                   // public protected
            System.err.println(con.getParameterCount());// 参数个数
            System.err.println(con.getParameters()); // 参数集合

        }

        // 调用此对象中的SAY方法,构造参数位_age=11,_name=honey
        myClass.getMethod("say")
                .invoke(myClass.getConstructor(int.class, String.class)
                        .newInstance(11, "honey"), null);
    }

}

 

程序执行结果为

com.myjava.reflect.Person
_age
2
int
_name
2
class java.lang.String
com.myjava.reflect.Person
1
2
[Ljava.lang.reflect.Parameter;@15db9742
honey今年11岁了

 

以上是关于JAVA---反射的主要内容,如果未能解决你的问题,请参考以下文章

反射机制入门

反射机制入门

反射机制入门

使用反射在外部JAR / CLASS上调用包含Hibernate事务的方法(Java EE)

为啥我的 Ray March 片段着色器反射纹理查找会减慢我的帧速率?

OpenGL片段着色器不照亮场景