Java反射机制

概述

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

获得Class对象

1.方式一

Class<?> cls1 = Class.forName("java.lang.String"); 

2.方式二

Class<?> cls2 = String.class;  

3.方式三

String str = "";
Class<?> cls3 = str.getClass();  

创建对象

1.方式一:通过Class.forName(ClassName).newInstance()调用无参构造函数.注意ClassName必须是全名。

        //相当于String str = new String();        
        Class<?> cls = Class.forName("java.lang.String");
        String str1 = (String)cls.newInstance();  

2.方式二:如果构造函数有参数,通过Constructor对象创建实例

        //以下相当于String str2 = new String("hello");
         Class<?> cls2 = Class.forName("java.lang.String");
         Constructor<?> constructor = cls2.getConstructor(String.class);
         String str2 = (String) constructor.newInstance("hello"); 

获取Class对应的方法

1.获取全部public方法

         Method[] methods = cls.getMethods();

2.获取指定public方法

         Method method = cls.getMethod("substring", int.class, int.class);

获取Class对应的成员变量

1.获取全部的成员变量

         Field[] fields = cls.getDeclaredFields();

2.获取指定的成员变量

         Field field = cls.getDeclaredField("value");

调用方法

格式如下,obj为要调用的实例对象,args是要调用方法要传入的实际参数。

 public Object invoke(Object obj, Object... args) 

示例:

        Method meth = cls2.getMethod("substring", int.class, int.class);
        String subString = (String)meth.invoke(str2, 0, 3);

实例详解

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
    public static void main(String[] args) throws ClassNotFoundException,
            InstantiationException, IllegalAccessException,
            NoSuchMethodException, SecurityException, IllegalArgumentException,
            InvocationTargetException, NoSuchFieldException {
        // 创建对象方式一:通过Class.forName(ClassName).newInstance()调用无参构造函数.注意ClassName必须是全名。
        Class<?> cls1 = Class.forName("java.lang.String");
        String str1 = (String) cls1.newInstance(); // 相当于String str = new String();
        // 创建Class对象的其它方式
        // Class<?> cls2 = String.class;
        // String str = "";
        // Class<?> cls3 = str.getClass();
        // 创建对象方式二:通过Constructor对象创建
        // 相当于String str2 = new String("hello");
        Class<?> cls2 = Class.forName("java.lang.String");
        Constructor<?> constructor = cls2.getConstructor(String.class);
        String str2 = (String) constructor.newInstance("hello");
        //调用方法
        Method meth = cls2.getMethod("substring", int.class, int.class);
        String subString = (String)meth.invoke(str2, 0, 3);
        System.out.println(subString);

        Class<?> cls = Class.forName("java.lang.String");
        // 获得String类的所有public构造函数
        Constructor<?>[] constructors = cls.getConstructors();
        for (Constructor c : constructors) {
            System.out.println(c);
        }
        System.out
                .println("-----------------------------------------------------------------");
        // 获得String类的所有public方法
        Method[] methods = cls.getMethods();
        for (Method m : methods) {
            System.out.println(m);
        }
        System.out
                .println("-----------------------------------------------------------------");
        // 获取指定方法
        Method method = cls.getMethod("substring", int.class, int.class);
        System.out.println(method);
        System.out
                .println("-----------------------------------------------------------------");
        // 获取全部的成员变量
        Field[] fields = cls.getDeclaredFields();
        for (Field f : fields) {
            System.out.println(f);
        }
        System.out
                .println("-----------------------------------------------------------------");
        // 获取指定的成员变量
        Field field = cls.getDeclaredField("value");
        System.out.println(field);
        System.out
                .println("-----------------------------------------------------------------");
    }
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。