【9】Java中的反射机制

一、反射的相关概念

1、什么是动态语言?:

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

2、反射的定义:

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

3、反射机制的作用:
  1. 反编译:.class–>.java;
  2. 可以判断运行时对象所属的类;
  3. 可以判断运行时对象所具有的成员变量和方法;
  4. 通过反射甚至可以调用到private的方法;
  5. 生成动态代理;
4、 反射机制的相关API类:
  1. java.lang.Class:它表示正在运行的Java应用程序中的类和接口;
  2. java.lang.reflect.Constructor:提供关于类的单个构造方法的信息以及对它的访问权限;
  3. java.lang.reflect.Field;:提供有关类或接口的属性信息,以及对它的动态访问权限;
  4. java.lang.reflect.Method:提供关于类或接口中某个方法信息;
  5. java.lang.reflect.Modifier:修饰符;

二、具体的API使用

1、获取类对象

获取类有三种方法,分别如下:

//第一种方式:通过包名获取
Class c1 = Class.forName("包名");

//第二种方式:
//java中每个类型都有class 属性.
User c2 = User.class;

//第三种方式:
//java语言中任何一个java对象都有getClass 方法
User e = new User();
Class c3 = e.getClass(); //c3是运行时类 (e的运行时类是User)
2、创建类的对象

获取类以后我们来创建它的对象,利用newInstance( );

User user3 = (User) c3.newInstance();
3、获取类的构造器
Constructor<?>[] cons = c3.getConstructors();
                for (int i = 0; i < cons.length; i++) {
                    // 一次返回类定义中所有public修饰符修饰的“构造器对象”,其与类定义中的构造器顺序不一定相同
                    System.out.println("Constructor " + cons[i]);
                }
4、创建特定参数类型的“构造器对象”所对应的实例
// 返回特定参数类型的“构造器对象”所新建的实例
                    User user40;
                    user40 = (User) c3.getConstructor(int.class, String.class).newInstance(12, "corn0");
5、获取该类对象的父类对象
    Class<?> father = c3.getSuperclass();
6、返回类对象所有的接口对象,数组
 Class<?>[] interfaceArray = c3.getInterfaces();
         for (int i = 0; i < interfaceArray.length; i++) {
                        // 与implements中接口顺序相同
        System.out.println("interface class instance " + i + " " + interfaceArray[i]);
                    }
7、获取全部属性
 Field[] fieldArray = c0.getDeclaredFields();
 for (int i = 0; i < fieldArray.length; i++) {
      System.out.println("filed " + i + " " + fieldArray[i]);
        }
8、获取和改变指定私有属性的值
  User u = new User(12, "北风", 66);
   try {
            // 直接获取private/私有属性的值
            Field nameField = c0.getDeclaredField("name");
            // 取消Java对访问修饰符的检查   
            nameField.setAccessible(true);
            String nameValue = (String) nameField.get(u);
            //name:yumidi
            System.out.println("name:" + nameValue);

            // 直接改变private/私有属性的值
            nameField.set(u, "corn");
            System.out.println("new name:" + u.getName());
        } catch (Exception e) {
            e.printStackTrace();
        } 
9、访问类的私有方法
try {
            Method method = c0.getDeclaredMethod("getResult");
            //取消Java对访问修饰符的检查
            method.setAccessible(true);
            int result = (int) method.invoke(u);
            System.out.println("result:" + result);
        }
10、访问类的静态方法
public static void hi(int a){
        System.out.println("hi"+a);
    }

 Class cls = Class.forName("com.corn.User");
            Method staticMethod = cls.getDeclaredMethod("hi",int.class);
            staticMethod.invoke(cls,2016);//这里不需要newInstance
11、给private的成员变量赋值
Class cls1 = Class.forName("com.corn.User");
            Object student = cls1.newInstance();//得到一个实例
            Field field = cls1.getDeclaredField("name");
            field.setAccessible(true);//设置允许访问  
            field.set(student, "郎平女神");
            System.out.println(field.get(student));

参考致谢:
1、Java总结篇系列:Java 反射
http://www.cnblogs.com/lwbqqyumidi/p/4107011.html
2、java反射详解
http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html
3、通过Java反射调用方法(关于调用private方法和static方法很详细)
http://blog.csdn.net/ichsonx/article/details/9108173

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值