---------------------- android培训、java培训、期待与您交流! ----------------------
反射
反射 不是jdk1.5的新特性 是很多框架使用的技术
Class类是描述各个java类的基本信息(包括类名,包,成员变量,方法,父类信息)
getInterface
getMethod
getMethods
等等得到类元素的方法
Class是代表类的类
得到字节码实例三种方法:
类名.class String.class
对象.getClass new Date().getClass();
Class.forName("类名"); Class.forName("java.lang.String");//"java.lang.String"可以用一个变量替换
8个基本数据类型+void 预定义Class对象
Class.isPrimitive()
isArray ()
int.class==Integer.TYPE
反射就是把java类中各种成分映射成相应的java类
//得到这个类的字节码
已经加载,直接找到返回
还未加载,用类加载器去加载,把加载进来的字节码缓存在虚拟机里面
.class 一串二进制代码
每一份字节码都是Class的实例对象
Constructor类
得到所有构造方法:Constructor[] constructors = Class.forName("java.lang.String").getConstructors();
得到某一具体的构造方法:Class.forName("java.lang.String").getConstructor(StringBuffer.class);//获得方法要用到类型
java.lang.reflect;
getDeclaringClass();
getModifiers();
newInstance(objec[]...)
String str = (String) constructor.newInstance(new StringBuffer("abc"));//调用方法时要用到上面类型是实例对象
编译的时候不知道返回的类型,只有运行才知道,编译时只看变量定义,不看代码执行
反射比较占用性能/时间
Class.newInstance();//jdk源码
String str = (String)Class.forName("java.lang.String").newInstance();
Field类
例子
ReflectPoint
private int x;
public int y;
生成构造函数快捷键:alt+shift+s
pt1= new ReflectPoint(3,5);
Field fieldY = pt1.getClass().getField("y");//field是类上的字段
fieldY.get(pt1);
私有的x
.getDeclaredField("x");
fieldX.setAccessible(true);
field.getType().equals(String.class);//———这边应该用==比较,因为他们字节码可能是一份,语义不准确
String oldValue = (String)filed.get(pt1/Object obj);
String newValue = oldValue.replace('b','a');
field.set(obj,newValue);
toString();
Method类
str1.charAt()
先调用方法,然后针对某个对象去调用
Method methodCharAt = Class.forName("xxx").getMethod("charAt",int.class);
methodCharAt.invoke(str1,1);//1与上一行int.class对应 str1为null说明是静态方法,因为静态方法不需要产生对象
com打头内部用
new object[]{} 零个
new object[]{2} 一个
自动装箱拆箱
用反射的方式执行某个类中的main方法
String startingClassName = args[0]; //数组角标越界
Method mainMethod = Class.forName(startingClassName).getMethod("main",String[].class)
mainMethod.invoke(null,new String[]{"111","222","333"})
//为了兼容jdk1.4 会自动解包
//1、外面加一个 new Object[]{}或者(Object)-效率可能更高
数组与Object的关系及其反射类型
相同类型且相同维度的数组属于同一类型
int[] a1 = new int[3]; a1.getClass().getSuperclass().getName();java.lang.Object;
Object[] obj = a1;错误
int[] a1 = new int[]{1,2,3};
String[] a1 = new String[]{"a","b","c"};
Arrays.asList(a1);//整型数组在jdk1.5中被当成一个对象打印
Arrays.asList(a4);//正常打印
asList(Object[] obj)
----------------------android培训、java培训、期待与您交流! ----------------------