------- 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出一个实例对象。