您的位置:首页 > 编程语言 > Java开发

java反射

2015-12-13 23:26 453 查看
什么是Class

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实例对象
反射会消耗程序性能

2.什么是反射
反射就是把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

欢迎留言交流
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: