黑马程序员_java高新技术(3)反射

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

一.自己理解的

反射就是照妖镜
运行是判断判断一个对象所属的类
运行时构造任意一个类的对象
class X{}
X x=new X();
x.getclass.getName();//获取全路径


c1=Class.forName("com.cisst.X");//括号里面填路径


通过反射获取类的名称




per=(person)c.newInstance()//找无参的构造方法


定义构造器
Constructor<?> cons[] =null;
cons=c.getConstrctors();获得构造函数数组
per=(Person)cons[0].newInstance("李兴华","30")


con[i].getParameterTypes()得到con[i]这个构造函数的全部参数,也是一个数组类型


Field f[]=c1.getDeclaredFields()//获取本类中的属性,也就是成员变量


反射就是JAVA类中各种成分映射成各种类
class.forName(“”)括号里面填入类的具体路径

二.张老师教程



反射就是JAVA类中各种成分映射成各种类
class.forName(“”)括号里面填入类的具体路径




反射的实例
public class ReflectTest{


    public static void main(String[] args)
   {
    String str1=“abc”;
   Class cls1=str1.getClass();
   Class cls2=String.class;
   Class cls3=Class.forNmae("java.lang.String")
   //他们三个都是同一份字节码,都是对应String,然后才能new出各种实例
   sop(cls1.isPrimitive())//是否是基本类型的字节码
  sop(int.class.isPrimitive())
  sop(int.class==Integer.class) //false
  sop(int.class==Integer.TYPE)//表示所包装类型的基本字节码
  sop(int[].class.isPrimitive)//fasle不是基本类型
  数组类型的class实例对象
  方法 int[].class.isArray()
   总之只要是在原程序中出现的类型都有各自的Class实例对象  例如void.class
}
}




REflectPoin pt1=new ReflectionPoint(3,5);
Field fieldY=pt1.getClass().getField("y");//获得成员变量
fieldY.get(pt1)//在pt1对象上的y的值
fieldX.setAccessible(true)//让私有的值也可以nadao




得到所有字段
Field f[]=c1.getDeclaredFields()//
遍历出来
for(Field field:f)
{
     if(field.getType==String.class//若果类型是String的,同一份字节码用==){
     {
      从字段中取出值
   String v=(String)field.get(c1);
   String nv=v.replace('b','a')
   field.set(obj,nv);
  }
}


成员方法的反射
方法与对象没关系,可以用类去调用
用反射的方式调用方法
Method MethodCharAt=Strin.class.getMethod(“charAt”,int.class)//参数是int
MethodCharAt.invoke(str1,args)//在对象上去调用方法  args是方法的参数
MethodCharAt.invoke(null,args)用来调用静态方法


JDK1.4方法
MethodCharAt.invoke(null,object[]{2})传一个两个数类型的数组






}



int [] a1=new int[3];

int[] a2=new int[4];

int[][] a3=new int[2][3];

sop(a1.getclass()==a2.getclass());//都属于同一个字节码

Object object1=a1;

Object[] object1=a1;数组里面装的是object

取数组里面的元素,不再用遍历了

Array.asList(a1);String用数组按1.4方式 可以列出每个数

int用1.5走 当做了一个参数


对数组进行反射

object obj=null;

printObject(obj);//现在给的数组才会有反应

printObject(object obj){

   Class clazz=obj.getclass();

  if(clazz.isArray())

         int len=Array.getLength(obj);

        for(int i=o;i<len;i++){

        sop(Array.get(obj,i))

}

}


}

如何得到每一具体元素的类型

int[] a=new int[3];

a[0].getClass().getName();


先搞一个集合

Collection collections=new ArrayList();//面向父类编程ArryList有顺序的,可重复

ReflectionPoint pt1=new ReflectionPoint(3,3);

ReflectionPoint pt2=new ReflectionPoint(3,5);

collections.add(pt1);

colllections.add(pt2);


HashCode的作用,只在hash类集合中有效

hashCode相等,eqauls不一定相等;eqauls相等,hashCode一定相等


如果不重写hashcode()方法那么hashcode()就代表地址值,肯定不能一样。就不能剔除同一种元素了。


java中存在内存泄露。


实现框架的功能

1.加载配置文件

InputStream ips=new FileInputStream("config.properties");

Properties prop=new Properties();

props.load(ips);

ips.close();

反射

String className=props.getProperty("className");

Collection collections=(collection)Class.getClass(className).newInstance();//得到对象后然后new出一个实例对象。

 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值