黑马程序员_高新技术学习笔记(第五章_上)

---------------------- 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培训、期待与您交流! ----------------------

 详细请查看:http://edu.csdn.net/heima

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值