黑马程序员---反射学习笔记

---------------------- android培训java培训、期待与您交流! ----------------------

终于可以发博文了,将近几天学习的东西整理一下。为以后再来复习整理些资料吧。

A .反射的书写思路

1.class->constructor-> new object 
         反射调用构造方法是
         Constructor cons=String.class.getConstructor(StringBuffer.class);
a.要给constructor传递参数类型
String str2=(String)cons.newInstance(new StringBuffer("abc"));
b.使用这个构造参数时,参数也要传递相应的参数类型对象

                c. 调用获得的方法时要用到上面相同类型的实例对象

B.反射方法的调用

Method methodcharat=String.class.getMethod("charAt",int.class);
methodcharat.invoke(调用的对象,调用方法的要用的参数)

methodcharat.invoke(null,参数)

由于静态方法的调用不需要对象,所以用了null来代替。即如果传递给method对象的invoke()方法的第一个参数是null,这就意味着该Method对象调用的是一个静态方法。

C.成员变量的反射

Field field =pt1.getClass().getField("变量的名字");
filed不是对象身上的变量,而是类上的,要用它去取某个对象对应的值
field.get(对象名);

注意:

getfield ( ) 方法只能得到public的成员

而getDeclaredField()可以得到任意的类型的变量,而私用变量还是不能使用。所以要用field.setAccessible(true);让他变得可用。
Field[ ] field=obj.getClass( ).getFields();
for(Field fi:field)
{
   if(fi.getType()==String.class)
{
   String oldValue=(String)field.get(obj);
   String newValue=oldValue.replace('b','a');
   field.set(obj,newValue);
}
}

D.为什么要用反射去调用

让我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。


我们并不知道要加载类的名字,如果是arg[0]就是要启动的类名
调用另一个类中main()方法
String startingClassName=args[0];
Method mainMethod=Class.forName("startingClassName").getMethod("main",String [].class)
mainMethod.invoke(null,new String[]{"123","234"});

注意 :

类加载器不仅可以加载类,还可以加载文件

Java要运行是要传递类的名字;

Java 要调用的完整的类的名子应为上面用到arg[0]
还有在传递参数给main方法时有一次拆包的过程!


所以有两种解决方法
a.再加一次包 new object[]{new String[]{"123","234"}};
b.告诉编译器这是一个object数组不要拆包
(object)new String[]{"123","234"};
基本的八种类型。。。int []当作object类型


数组的反射应用
import java.lang.reflect.Array;
public class printObject {
public static void printObject(Object ob)
{
Class clazz=ob.getClass();
if(clazz.isArray())
{
int len=Array.getLength(ob);
for(int i = 0;i<len;i++)
{
System.out.println(Array.get(ob, i));
}
}else{
System.out.println(ob);
}
}


}


配置文件config.properties的应用

FileInputStream ips=new FileInputStream("config.properties");
Properties props=new Properties();
props.load(ips);
ips.close();
String classname=props.getProperty("classname");
Collection collect=(Collection)Class.forName(classname).newInstance(); 

---------------------- android培训java培训、期待与您交流! ----------------------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值