java的反射机制

来源:互联网 发布:java面试基础知识 编辑:程序博客网 时间:2024/06/16 12:36

1,什么是java的反射机制?

是在运行期,对于任意一个类(这个类指的是Object或者Iterface等等的Class类),都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种在运行期动态生成对象,并改变它的状态的功能称为java语言的反射机制。

2,java反射机制的优点以及缺点是什么?

   优点:因为可以在运行期动态获取类的属性和方法,改变对象的状态,所以增大了程序的灵活性;利用这种特性可以实现动态代理机制!
缺点:原先我们的java程序是先预编译成.java->.class文件,然后再执行,编译器会对代码进行优化。现在是要在运行期动态获取Class类,再由Class去生成一个对象,这样会导致编译器要频繁地做安全检查,访问控制以及方法传参的类型检查等等,机器的反应时间相差在数量级上,但对于人来说忽略不计(不知道我理解的对不对,欢迎各位道友指正,感激不尽)

3,java反射机制的基本用法

首先要获取一个Class对象,有三种方式:
<span style="font-size:14px;">第一种方式:Class c = Class.forName("Test");第二种方式:Class c = Test.class; 第三种方式:Test test = new Test();Class c = test.getClass();</span>
生成对象:
<span style="font-size:14px;">Test t = (Test) c.newInstance();Test t = (Test) c.newInstance();//            Constructor<Test> constructor = c.getConstructor();//获取无参的构造函数//            Test t = constructor.newInstance();Constructor<Test> constructor = c.getConstructor(String.class,int.class);//获取有参的构造函数Test t = constructor.newInstance("test",1);</span>
获取类中的属性:
<span style="font-size:14px;">Field[] fields = c.getDeclaredFields();//获取属性集合Field field = c.getDeclaredField("name");//获取特定的属性Test t1 = (Test)c.newInstance();field.setAccessible(true);//打破封装性,实现属性赋值field.set(t1,"test");//赋值System.out.print(t1.getName());//获取属性的修饰以及类型Modifier.toString(field.getModifiers());//privatefield.getGenericType();//String</span>
获取类中的方法并执行,包括静态方法:
<span style="font-size:14px;">Method method = c.getDeclaredMethod("print",String.class);method.invoke(t1,"反射获取的方法");//调用真实对象t1的print方法去执行Method method1 = c.getDeclaredMethod("print1",String.class);method1.invoke(null,"反射获取的Static方法");//调用Test的静态print1方法去执行</span>
反射操作数组对象:
<span style="font-size:14px;">Object o = Array.newInstance(Integer.TYPE,10);//创造一个长度为10的一维int数组int[] ints = new int[]{5,8};Object array = Array.newInstance(Integer.TYPE,ints);//返回一个二维数组System.out.print("====二位数组====" + array);array = Array.get(array,3);//返回索引为三的一维数组System.out.print("====一位数组====" + array);Array.set(array, 3, 12);//设置索引为3的值是12System.out.print(Array.get(array, 3) + "");</span>

以上纯属个人学习笔记,有说得不对的地方,各位看官随意喷!







0 0
原创粉丝点击