黑马程序员-------反射
来源:互联网 发布:云服务器能绑定域名吗 编辑:程序博客网 时间:2024/06/05 02:42
---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------
反射技术(不是1.5的新特性 是从1.2开始的)
反射就是将java类中的各种成分映射成相应的java类
反射的作用:应用反射技术开发框架
(1)Class类型
如何得到各个字节码对应的对象实例
a。类名.class,例如,System.class
b.对象.getClass(),例如 new Date().getclass
c.Class.forName("类名");
如下例:
String str1="abcx";
Class cls1=str1.getClass();
Class cls2=String.class;
Class cls3=Class.forName("java.lang.String");
System.out.println(cls1==cls2);
System.out.println(cls1==cls3);
System.out.println(cls1.isPrimitive());//判断是否是原始类型
System.out.println(int.class.isPrimitive());
System.out.println(int.class==Integer.class);
System.out.println(int.class==Integer.TYPE);//判断Integer(包装类)的类型是否是基本类型
System.out.println(int[].class.isPrimitive());
System.out.println(int[].class.isArray());//判断数组是否为基本类型
(2) //构造方法的反射
Constructor constructor1=String.class.getConstructor(StringBuffer.class);
String str2=(String)constructor1.newInstance(new StringBuffer("abc"));
System.out.println(str2.charAt(2));
//成员变量的反射
ReflectPoint pt1=new ReflectPoint(3,5);
Field fieldY=pt1.getClass().getField("y");//得到类上的字段
//这里fieldY不是对象身上的变量,而是类上的,要用它取对象上对应的值
System.out.println(fieldY.get(pt1));
Field fieldX =pt1.getClass().getDeclaredField("x");//x是私有的 所以他的字段是getDeclaredField
fieldX.setAccessible(true);//强行反射 获得私有成员的值
System.out.println(fieldX.get(pt1));
//成员方法的反射
Method methodCharAt=String.class.getMethod("charAt", int.class);
System.out.println(methodCharAt.invoke(str1/*null*/, 1));
//如果这里是null 则说明该Method对应的方法是方法是静态方法 只有静态方法调用不需要对象
///实例将字符串中字符替换
package cn.itcast.day1;
public class ReflectPoint {
private int x;
public int y;
public String st1="ball";
public String st2="baseketball";
public String st3="itcast";
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
@Override
public String toString(){
return st1+"::::"+st2+"::::"+st3;
}
}
在另一个类中
private static void changeValue(Object obj) throws Exception{
// TODO Auto-generated method stub
Field[] fields=obj.getClass().getFields();//通过对象的字节码得到对象的字段
for(Field field:fields){//使用高级循环对字段进行循环
if(field.getType()==String.class)
//使用=号进行判断字段的类型是否和字符串的字节码相同 ,注意这里用=号要比equles好因为如果字节码只有相同的一份就不能用equals;
{
String oldValue=(String)field.get(obj);//若类型相同则通过get得到值
String newValue=oldValue.replace('b', 'a');
field.set(obj, newValue);
}
}
//对接受数组参数的成员方法进行反射 (main方法)
mainMethod.invoke(null,new Object[]{new String[]{"****"}}) 原因是将数组封装到Object【】中 防止编译器拆包
null,(Object){new String[]{}} 封装成Object对象 防止拆包
// 数组的反射应用(用于将数组中元素取出)
7、HashSet与ArrayList的比较以及HashCode的分析
// TODO Auto-generated method stub
Collection collections=new HashSet();//new ArrayList();
//这里hashset使集合中不可以有重复的元素 而ArrayList只是按顺序存储
ReflectPoint pt1=new ReflectPoint(3,3);
ReflectPoint pt2=new ReflectPoint(5,5);
ReflectPoint pt3=new ReflectPoint(3,3);//如何判断pt1和pt3相同 使用hashset
//HashCode()作用是计算hashset中元素存入的哈希吗 当从hashset中查找元素时先调用hashcode计算哈希码 根据哈希码找元素
collections.add(pt1);
collections.add(pt2);
collections.add(pt3);
collections.add(pt1);
// pt1.y=7;
/*当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的哪些参与计算哈希值的字段了,否则对象修改后的哈希值与最初存储进集合中的不同,这样检索不到对象了,也会删除不了对象 ,这样会造成内存泄露。
Java中也会存在内存泄露, 所谓内存泄露就是永久不用的对象没有进行释放,也可以有在不正确的地方创建对象。
*/
collections.remove(pt1);
System.out.println(collections.size());
}
8、应用反射技术开发框架
className=java.util.HashSet 框架
InputStream ips=new FileInputStream("config.properties");
Properties props=new Properties();//这里的Properties相当于HashMap 有键值对对应
props.load(ips);//关联文件
ips.close();
String className=props.getProperty("className");//这里的Properties相当于HashMap 有键值对对应 及className键对应的值为classname(第一个)
Collection collections=(Collection)Class.forName(className).newInstance();//调用对象的午餐构造方法
/配置文件的加载通常使用类加载器
InputStream ips=ReflectTest2.class.getClassLoader().getResourceAsStream("cn/itcast/day1/config.properties");
---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://edu.csdn.net/heima" target="blank">http://edu.csdn.net/heima</a>
- 黑马程序员--java 反射
- 黑马程序员之反射
- 黑马程序员之反射
- 黑马程序员__java_反射
- 黑马程序员_反射
- 黑马程序员 反射
- 黑马程序员--Java反射
- 黑马程序员--反射
- 黑马程序员-java-反射
- 黑马程序员:反射技术
- 黑马程序员_java反射
- 黑马程序员---反射
- 黑马程序员-反射
- 黑马程序员---反射
- 黑马程序员_反射
- 黑马程序员_反射
- 黑马程序员:反射
- 黑马程序员_反射
- Silverlight编译问题:未给任务“CreateRiaClientFilesTask”的必需参数“ClientFrameworkPath”赋值
- 虚拟机安装XP系统图解之二:新建虚拟机与xp系统的安装
- Linux服务器监控方案参考
- 单例模式
- Ubuntu搭建Eclipse+JDK+SDK的Android
- 黑马程序员-------反射
- poj 2488 A Knight's Journey 解题报告 DFS
- WinSocket模型的探讨——Overlapped模型(一)(转)
- 23种设计模式(2):工厂方法模式
- 黑马程序员-----jdk1.5新特性
- 分水岭算法详细步骤-matlab
- 指针、指针的引用
- 黑马程序员--循环结构的学习和练习、函数
- 如何用opencv对Gige Vision相机采集图像。。。请高手指教