反射主要的三个方法1、Constructor 2、Field 3、Method。三个的用法在下边的demo中,不对的地方,大家提出来,希望共勉。
public class Num4 {
public static void main(String[] args) throws Exception {
//反射获得字节码的三种方式,三种返回的字节码都是一样的
String str1 = "12";
Class cla1 = str1.getClass();
Class cla2 = String.class;
Class cla3 = Class.forName("java.lang.String");
System.out.println(cla1 == cla2);
System.out.println(cla1 == cla3);
//利用反射的Constructor构造器来创建类或对象, new String(new StringBuffer("abc"))
Constructor constructor = String.class.getConstructor(StringBuffer.class);//StringBuffer.class获得类的字节码
String str = (String)constructor.newInstance(new StringBuffer("abc")); //需要强制类型转换
System.out.println(str);
//利用反射的Field来获取成员变量方法
Person p = new Person();
Field fy = p.getClass().getField("y");
System.out.println(fy.get(p));
Field fx = p.getClass().getDeclaredField("x");//获取私有的变量
fx.setAccessible(true); //为true表示获得修改的权限
System.out.println(fx.get(p));
changStringValue(p);
Field fy2 = p.getClass().getField("y");
System.out.println(fy2.get(p));
//利用反射的Method来获取类中的方法
Class clas = Num4.class;
Method add = clas.getMethod("add", new Class[]{int.class,int.class});
//invoke类的(Object obj,Object args[])方法接受的参数必须为对象
//如果实际被调用的方法的返回类型是基本类型数据,那么invoke()方法会把它转换为相应的包装类型的对象
Object obj = (Object)add.invoke(clas.newInstance(), new Object[]{new Integer(100),new Integer(200)});
System.out.println(obj);
}
private static void changStringValue(Object obj) throws Exception {
Field[] fields = obj.getClass().getFields();
for(Field field : fields){
if(field.getType() == String.class){
String oldValue = (String)field.get(obj);
String newValue = oldValue.replace("a", "b");
field.set(obj, newValue);
}
}
}
public int add(int a,int b){
return a + b;
}
public String abc(String s){
return s;
}
}
class Person{
private String x = "abc";
public String y = "dddaa";
}
|