- 什么是Class
2.什么是反射java中的类用于描述事物的属性和功能Class类用于描述这些类的共性--->字节码数据字节码-->创建多个对象例如://类的字节码Class<?> dateClass1=java.util.Date.class;//对象所属类的字节码
java.util.Date da=new java.util.Date();Class<?> dateClass2=da.getClass();//通过类所在路径加载类的字节码,反射多用这种方法Class<?> dateClass3= Class.forName("java.util.Date");九个预定义的Class对象八个基本类型(byte short int char boolean float double lang)和void
总结:字节码创建类,类创建对象-->通过对象找到类,通过类找到字节码(Class)基本类型的字节码和引用类型的字节码不是同一个内存地址int.class==Integer.TYPE;基本数据类型对应的包装类的TYPE属性为基本数据类型的字节码基本类型的数组的字节码不是基本类型的字节码(用字节码的isPrimitive()方法判断)判断字节码是不是数组的方法(Class.isArray());只要在源程序出现的类型都有对应的Class实例对象反射会消耗程序性能
反射就是把java类中的各种成分映射成对应的java类
描述构成类的成分的类:Field,Method,Constructor,Package...
Constructor:构造方法,由Constructor创建一个对象
无参构造方法:
例如:
String str=java.lang.String.class.newInstance();
有参构造方法:
例如:
Constructor con=java.lang.String.class.getConstructor(StringBuffer.class);
String newInstance = (String) con.newInstance(new StringBuffer("hehe"));
Filed:字段的反射
//Person类用于测试
package com.test;
public class Person {
public String uname;
private String passd;
public String getPassd() {
return passd;
}
public void setPassd(String passd) {
this.passd = passd;
}
public Person(String uname, String passd) {
super();
this.uname = uname;
this.passd = passd;
}
}
//反射创建Person对象
Person p=(Person)Class.forName("com.test.Person").getConstructor(String.class,String.class).newInstance(new String("hehehe"),new String("123he"));
//获取对象的公有字段和
Field field=com.test.Person.class.getField("uname");
String uname=(String) field.get(p);
System.out.println(uname);
//获取对象的非公有字段
Field field1=com.test.Person.class.getDeclaredField("passd");
field1.setAccessible(true);
String passd=(String) field1.get(p);
System.out.println(passd);
//改变对象里的所有公有String字段
Field [] fields=com.test.Person.class.getFields();//只能获取公有字段
for (Field f : fields) {
if(f.getType()==String.class){
String oldfield=(String)f.get(p);
String newfield=oldfield.replace("h", "g");
f.set(p, newfield);
}
}
//数组的反射
String [] str1=new String[]{"a","b","c"};
Class c=str1.getClass();
if(c.isArray()){
int len=Array.getLength(str1);
for (int i = 0; i < len; i++) {
System.out.println(Array.get(str1, i));
}
}
Method 类方法的反射
Method me=String.class.getMethod("charAt", int.class); //方法对象me的invoke方法 System.out.println( me.invoke(uname, 2));
当uname为null时表示调用静态方法,以后参数为可变长度的方法参数
通过反射,获得方法参数泛型里的参数类型
public class Test {
public static void main(String[] args) {
Vector<Person> plist=new Vector<Person>();
try {
Method me=Test.class.getMethod("getT", Vector.class);
Type[] types = me.getGenericParameterTypes();
ParameterizedType type= (ParameterizedType)types[0];
System.out.println(type.getRawType());
System.out.println(type.getActualTypeArguments()[0]);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
public void getT(Vector<Person> plist){
}
}
输出:
class java.util.Vector
class com.test.Person
欢迎留言交流