`
liuhaifang
  • 浏览: 8711 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

黑马程序--java反射实例

 
阅读更多

-------------------------------------------android培训期待与您交流 -------------------------------------
反射:把class映射成java类

Constructor构造器
1、 得到所有的构造方法

Constructor[] ctc=Class.forName(“”).contructors();

 
2、 得到某个构造方法

Constructor  ctc=Class.forName().getConstructor(StringBuffer.class)

3、 创建对象

String str=(String)Ctc.newInstance(new StringBuffer(“abc”));

注:class.newInstance()与constructor.newInstance()的区别:前者只能调用无参的构造函数创建实例对象,后者可以调用无参和有参的构造函数创建实例对象


Field:成员函数的反射

//创建测试类
public class ReflectPoint {
private  int x;
public int y;
public String str1="ball";
public String str2="basketball";
public String itcast="itcast";
public ReflectPoint(int x, int y) {
this.x = x;
this.y = y;
}
}
public static void main(String[] args) throws Exception{
ReflectPoint r=new ReflectPoint(3, 5);
Field x=r.getClass().getField("y");
// f.setAccessible(true);
System.out.println(x.get(r));//field不是类上的值,而是对象上的值,所有要去对象上的值
Field y=r.getClass().getDeclaredField("x");//获取私有的属性
y.setAccessible(true);//获取权限
System.out.println(y.get(r));

Field[] fileds=r.getClass().getFields();//替换字符
for (Field field : fileds) {
if(field.getType()==String.class){//字节码比较用==
String oldstr=(String)field.get(r);
String newstr=oldstr.replaceAll("a", "b");
field.set(r, newstr);//重新设值
}

}
}

 
Method:方法的反射

public class ReflectPoint {
private  int x;
public int y;
public String str1="ball";
public String str2="basketball";
public String itcast="itcast";
public ReflectPoint(int x, int y) {
this.x = x;
this.y = y;
}

public static void staticMethodReflect(){
System.err.println("aaaaa");
}

public void methodReflect(String str){
System.err.println(str);
}

@Override
public String toString(){
return x+":"+y;

}
}
//调用methodReflect方法
Method method=r.getClass().getMethod("methodReflect",String.class);//第一个参数是方法的名称,第二个参数是输入形参的class类型
method.invoke(r,"aaaa");//反射的方法是对象上的方法   所以传入对象和实现参数
//静态方法的调用
Method method2=r.getClass().getMethod("staticMethodReflect",String.class);
method2.invoke(null,"bbbb");//静态方法的调用

 
数组的反射
如:

Public static void main(string[] arg){
……..
}

Method method2=r.getClass().getMethod("main",String[].class);
method2.invoke(null,new object[]{new String[]{"abc","bcd"}});

 
//jdk为了兼容以前的版本,在反射时,如果方法有数组形参,在调用时,编译器会隐式的把参数打成一个包,所以在调用时要再次进行包装

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics