------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
反射的概念:
反射就是把Java类中的各种成分映射相成Java类。
反射机制:
简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息。
反射机制的优缺点:
首先得先明白静态编译和动态编译是什么
静态编译:在编译时确定类型,绑定对象,即通过。
动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多 态的应用,有以降低类之间的藕合性。
反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性。
它的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它 满足我们的要求。这类操作总是慢于只直接执行相同的操作。
Class类用于表示.class文件,是所有加载进内存的字节码对象的父类。所以可以通过Class得到运行时的类。
其中有三种方法可以获取Class类的对象:
(例如已先声明了一个Person类)
//第一种方式:
Class c1 = Class.forName("Person");
//第二种方式:
//java中每个类型都有class 属性.
Class c2 = Person.class;
//第三种方式:
//java语言中任何一个java对象都有getClass方法
Employeee = new Person();
Class c3 = e.getClass(); //c3是运行时类 (e的运行时类是Person)
创建Class对象:
Class c=Class.forName("className");//注明:className必须为全名,也就是得包含包名,比如,cn.my.Person;
Object obj=c.newInstance();//创建对象的实例
有了对象后就可以获取类的各种信息了
获得构造函数的方法
Constructor getConstructor(Class[] params)//根据指定参数获得public构造器
Constructor[] getConstructors()//获得public的所有构造器
Constructor getDeclaredConstructor(Class[] params)//根据指定参数获得public和非public的构造器
Constructor[] getDeclaredConstructors()//获得public的所有构造器
获得类方法
Method getMethod(String name, Class[] params),根据方法名,参数类型获得方法
Method[] getMethods()//获得所有的public方法
Method getDeclaredMethod(String name, Class[] params)//根据方法名和参数类型,获得public和非public的方法
Method[] getDeclaredMethods()//获得所以的public和非public方法
获得类中属性
Field getField(String name)//根据变量名得到相应的public变量
Field[] getFields()//获得类中所以public的方法
Field getDeclaredField(String name)//根据方法名获得public和非public变量
Field[] getDeclaredFields()//获得类中所有的public和非public方法
boolean isPrimitive()--判断当前类是否为基本类型(基本类型有boolean、byte、char、short、int、long、float 和 double)
boolean isArray()--判断当前类是否为数组(数组也是类,例如int[].class)
Field类:Field对象对应到类上面的成员变量,而不是类对象上的成员变量
代码示例:
import java.lang.reflect.Field;
public class Person {
public int age;
private int height;
public Person(int age,int height){
this.age=age;
this.height=height;
}
}
class ReflectTest{
public static void main(String...args) throws Exception{
Person person = new Person(20,30);
//获取所有的成员变量(包括私有成员变量)
Field[] fields = person.getClass().getDeclaredFields();
//获取Person类的公共成员变量age
Field fieldAge = person.getClass().getField("age");
//获取成员变量的类型
Class type = fieldAge.getType();
//设置age成员变量的值
fieldAge.set(person, 34);
//获取成员变量age的值
Object s = fieldAge.get(person);
Field fieldHight = person.getClass().getField("height");
//使用setAccessible(true),才能获取私有变量
fieldHight.setAccessible(true);
//获取私有成员变量的值
Object h =fieldHight.get(person);
System.out.println(s);
}
}
Method方法:Method类代表某个类中的一个成员方法。
例如:Method charAt =Class.forName(“java.lang.String”).getMethod(“charAt”,int.class);
调用方法:
常用方式:System.out.println(str.charAt(1));
反射方式:System.out.println(charAt.invoke(str,1));
jdk1.4和jdk1.5的invoke方法的区别:
jdk1.5: public Object invoke(Object obj,Object …args);
jdk1.4: public Object invoke(Object[] args);
反射操作数组的小例子:
import java.lang.reflect.*;
class hello{
public static void main(String[] args) {
int[] temp={1,2,3,4,5};
Class<?>demo=temp.getClass().getComponentType(); //<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">getComponentType方法</span><span style="font-size: 12px; font-family: Arial, Helvetica, sans-serif;">返回表示数组组件类型的 Class</span>
System.out.println("数组类型: "+demo.getName());
System.out.println("数组长度 "+Array.getLength(temp));
System.out.println("数组的第一个元素: "+Array.get(temp, 0));
Array.set(temp, 0, 100);
System.out.println("修改之后数组第一个元素为: "+Array.get(temp, 0));
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------