---------------------- android培训、java培训、期待与您交流! ----------------------
一、 反射的基础_Class类
1、Class类: java程序中各个java类属于同一种事物,描述这类事物的java类名就是Class。
Class其实就是java类被编译后生成的字节码的引用数据类型。
例如:Class cls1= System.class; Class cls2 = Date.class;
2、得到各个字节码对应的实例对象的三中方法
①类名.class 例如Class cls1 = System.class;
②对象.getClass()例如 new Date().getClass();
③Class.forName(“类名”) 例如 class.forName(“java.util.Date”) 此是反射常用的获得类字节码的方法,,可以在使用的时候才传入在编译不确定的类名。
3、类型Class实例对象(字节码)的特点简单介绍
public class ReflectTest{
public static void main (String[] args){
String str1 =”abc”;
Class cls1= str1.getClass();
Class cls2= String.class;
Class cls3= Class.forName(“java.lang.String”);
System.out.print(cls1= = cls2);//true
System.out.print(cls2= = cls3;//true
//三者是共一份String字节码。
System.out.print(cls1.isPrimitive());//判断是否为八大基本类型(int boolean long short float double byte char)和void之一
System.out.print(int.class= =Integer.class);//false
System.out.print(int.class= =Integer.TYPE);//true Integer.TYPE的TYPE就是指Integer包装的字节码,即Integer包装了int的字节码
System.out.print(int[].class.isPrimitive());//true
System.out.print(int[].class.isArray());//true
}
}
总之,只要是在源程序出现的类型,都有各自的Class实例对象,例如,int[ ],void…都有自己的字节码。
二、 理解反射的概念
反射就是把java类中的各种成分映射成相应的java类。
例如,一个java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等信息也用一个个的java类来表示,就像汽车是一个类,汽车的发动机,变速箱等也是一个个类。表示java类的Class类显然要提供一系列的方法来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field、Method、Contruct、Package等等。
三、 分类讲述常用的反射
⒈构造方法的反射应用
Constructor类代表某个类中的一个构造方法。得到某个类的所有构造方法:例子
Constructor [] constructor = Class.forName(“java.lang.String”).getConstructors();
得到某一个构造方法,例子:
Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);
//获得某个构造方法需要指定参数类型
Constructor constructor1 =String.class.getConstructor(StringBuffer.class,int.class);//得到构造方法用参数区分是哪个构造函数
创建实例对象:
通常方式:Stringstr = new String(new StringBuffer(“abc”));
反射方式:1、Constructor constructor =Class.forName(“java.lang.String”).getConstructor (StringBuffer.class);
2、String str = (String)constructor.newInstance (new StringBuffer(“abc”));
Class中也有一个newInstance()方法:Class. newInstance()
例子:String obj= (String) Class.forName(“java.lang.String”). newInstance();该方法内部先得到默认的构造方法(无参数的哪个构造方法),然后用该构造方法创建实例对象。
⒉成员变量的反射
Field类代表某个类中的一个成员变量。
得到的Field对象时对应到类上面的成员变量,所以在取某个成员变量值的时候要注意方法。
例子:publicclass ReflectPoint {
privateintx;
publicinty;
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
}
import java.lang.reflect.Field;
publicclass FiledTest {
publicstaticvoid main(String[] args) throws Exception{
ReflectPoint pt1 = new ReflectPoint(3,5);
Field fieldy= pt1.getClass().getField("y"); //fieldy不是对象的变量,是类上的,要用它去取某个对象身上对应的值
System.out.println( fieldy.get(pt1));//只能取公有成员
//取私有成员方法如下:
Field fieldx= pt1.getClass().getDeclaredField("x");
fieldx.setAccessible(true);
System.out.println(fieldx.get(pt1));
}
}
⒊成员方法的反射(Method类)
Method类代表某个类中的一个成员方法。
得到类中的某一个方法:
public Method getMethod(String name, Class<?>... parameterTypes)
throws NoSuchMethodException, SecurityException
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。name 参数是一个 String,用于指定所需方法的简称。parameterTypes 参数是按声明顺序标识该方法形参类型的 Class 对象的一个数组。如果 parameterTypes 为 null,则按空数组处理。
例子MethodcharAt = Class.forName(“java.lang.String”).getMethod(“charAt”,int.class);
String str = “abc”;
调用方法charAt打印出b字符
通常方法:System.out.println(str.charAt(1)));
反射方法:MethodmethodcharAt = String.class. getMethod(“charAt”,int.class);
System.out.println(methodcharAt.invoke(str,1));
public Objectinvoke(Object obj, Object... args) throws llegalAccessException,IllegalArgumentException, InvocationTargetException
对带有指定参数的指定对象调用由此Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。 如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。如果方法正常完成,则将该方法返回的值返回给调用者;如果该值为基本类型,则首先适当地将其包装在对象中。但是,如果该值的类型为一组基本类型,则数组元素不被包装在对象中;换句话说,将返回基本类型的数组。如果底层方法返回类型为 void,则该调用返回 null。
---------------------- android培训、 java培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net/heima