- ---------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
1、反射的基石——Class类
简介:每一个类都相当于一个字节码文件(.class),而这些类都是一个类的实例化对象,这个类就是Class类。
一个类获得其Class类的方法(即获得这个类的字节码文件)有以下几种:
1、类名.class //Class clas1 = String.class
2、对象.getClass() //String str = “abc”;
Class clas2 = str.getClass();
3、Class.forName(“包.类名”) 范例:Class clas1= Class.forName(“java.lang.String”)
注意: int.class == Integer.TYPE;
Class类的方法
String getName()
取得类的名称
Package getPackage()
取得类所在的包
Method getMethods()
取得类的所有方法,
Method getMethod(String name,Class<T> types)
取得类的某个方法
Class<T>[] getInterfaces()
得到类所实现的所有接口
Field getField(String name)
返回一个field对象,它表示了类的某个字段(属性)
Field[] getFields()
返回field数组,表示此类的所有字段
Constructor getConstructor(Class<T> types)
取得一个构造方法
Constructor<T> getConstructors()
取得所有构造方法
T newInstance()
创建一个此类的实例
Static Class<T> forName(String className)
返回此类的Class对象
Boolean isPrimitive()
判断此类是否为基本类型(9个预定义的:int,byte,boolean,short,long,char,double,flout,void)
Boolean isArray()
判断此类是否为数组类
getSuperclass()
得到父类
2、反射的概念
反射就是把JAVA类中的各个成分映射成相应的java类。
例如: 类中的方法映射成Method类:
Method[] method1 = Person.class.getMethods();
类中的成员变量映射成Field类;
类中的构造方法映射成Constructor<T>类;
类的包映射成Package类;
3、构造方法的反射:Constructor类
Int getModifiers()
返回该方法的修饰符
Class getDeclaringClass()
获得此构造方法的Class类
T newInstance(Object… initargs)
用指定的初始化参数初始化该实例
例子:
1、 String.class.getConstructor(StringBuffer.class);
2、 String.class.getConstructor(StringBuffer.class,int.class);
3、 实现new String(new StringBuffer(“abc”))的效果:
Constructor constructor1 = String.class.getConstructor(StirngBuffer.class);
Sting str2 = (String) constructor1.newInstance(new StringBuffer(“abc”));
4、成员变量的反射:Field
set(Object obj,Object value)
设置值
Class getType()
返回字段类型(即这个类型的类的字节码文件)
例子:
Filed fieldY = pt1.getClass().getField(“y”); //取得类中的变量y
fieldY.get(pt1); // 取得变量y在对象pt1中的值
注意:getField() //用于可见的变量
getDeclaredField() // 不管可见不可见,都能看见
暴力反射:Field fieldX = pt1.getClass().getDeclaredField(“x”);
fieldX.setAccessible(true); //共享
System.out.print(fieldX.get(pt1));
5、成员方法的反射:Method类
invoke(null,Object args)
调用静态方法
invoke(Object obj,Object args)
obj对象调用该方法,参数为args
例子:
Method methodCharAt = String.class.getMethod(“charAt”,int.class);
method.invoke(str1,1);
6、数组的反射
只要是同一维数和同一数据类型,则使用同一字节码文件,例如:
int a = new int[4];
int b = new int[6];
String[] c = new String[3];
int d = new int[2][4];
a.getClass() == b.getClass();
关于Array类:
Array类提供了许多静态方法用以完成一些功能(针对数组的Class类)
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------