Java反射

Posted 水木竹水

tags:

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

将之前学的Java反射进行一个汇总记录。

1. Class对象实例化

Java反射机制就是通过Class对象创建对应实例,并调用相关方法。首先是需要有Class对象,有三种获取Class对象的方式:

(1)Object.getClass(),如Person p = new Person;对应的Class对象为p.getClass().

(2)类.class,如Person.class

(3)Class.forName(),如Class.forName("com.xxx.Person");

2.反射实例化对象

拿到类的Class对象,可通过反射进行实例化。有两种方式:

(1)clazz.newInstance()  在1.9版本被标注@Deprecated(since="9")

(2)clazz.getDeclaredConstructor().newInstance()  该方法可以抛出InvocationTargetException 和 NoSuchMethodException两个异常

3.反射与工厂设计模式

利用Class.forName()方法和clazz.getDeclaredConstructor().newInstance()可以实现类实例化的工厂设计模式,如下:

class Factory{
    private Factory(){}

    public static <T> T getInstance(String className, Class<T> clazz){
        T instance  = null;
        try{
           instance = (T) Class.forName(className).getDeclaredConstructor().newInstance();
        }catch (Exception e){

        }
        return instance;
    }
}

4.反射与类操作

(1)获取包信息:public Package getPackage()  其中Package implements AnnotatedElement,AnnotatedElement标注可以返回对应注解

(2)获取继承的父类:public Class<? super T> getSuperclass()

(3)获取实现的接口:public Class<?>[] getInterfaces()

(4)获取构造方法:

    获取全部构造方法:public Constructor<?>[] getDeclaredConstructors()

    获取指定构造方法:public Constructor<T> getDeclaredConstructor?(Class<?>... parameterTypes),其中参数为参数类型,如String.class等

(5)获取方法:

    获取全部方法(包含父类):public Method[] getMethods()

    获取指定方法(保安父类):public Method getMethod?(String name,Class<?>... parameterTypes),其中name为方法名,后边为方法参数类型

    获取本类全部方法:public Method[] getDeclaredMethods()

    获取本类指定方法:public Method getDeclaredMethod?(String name,Class<?>... parameterTypes),其中name为方法名,后边为方法参数类型

  Method中重要的方法为:public Object invoke?(Object obj, Object... args),其中第一个参数为对象实例,第二个参数为method的参数。反射方法调用主要通过该方法进行。

(6)获取属性

    获取全部属性(包含父类和接口的所有public属性):public Field[] getFields()

    获取指定属性(包含父类和接口的所有public属性):public Field getField?(String name)

    获取本类全部属性(不包含继承的属性):public Field[] getDeclaredFields()

    获取本类指定属性:public Field getDeclaredField?(String name)

  Field中重要的方法:public Class<?> getType(),返回属性类型。

(7)底层有个Unsafe工具类,可以通过该类绕过JVM实例化对象,但程序中不建议使用。

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

反射机制入门

反射机制入门

反射机制入门

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

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

OpenGL片段着色器不照亮场景