A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 成果 黑马帝   /  2012-2-9 20:43  /  2031 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天看了部份反射的视屏。好像什么东西都有反射。但始终不知道为什么要用反射。其他方法不是也能实现么。用反射有什么好处么?在哪些情况下建议用反射咧。求解

4 个回复

倒序浏览
什么是JAVA的反射机制 :
Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。
Java反射机制容许程序在运行时加载、探知、使用编译期间完全未知的classes。
换言之,Java可以加载一个运行时才得知名称的class,获得其完整结构。

java反射的应用:
1、获取类的Class对象
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。
2、获取类的Fields
可以通过反射机制得到某个类的某个属性,然后改变对应于这个类的某个实例的该属性值。JAVA 的Class<T>类提供了几个方法获取类的属性。
3、获取类的Method
通过反射机制得到某个类的某个方法,然后调用对应于这个类的某个实例的该方法
4、获取类的Constructor
通过反射机制得到某个类的构造器,然后调用该构造器创建该类的一个实例  
5、新建类的实例
通过反射机制创建新类的实例,
6、调用类的函数
通过反射获取类Method对象,调用Field的Invoke方法调用函数。
7、设置/获取类的属性值
通过反射获取类的Field对象,调用Field方法设置或获取值

动态创建代理类
代理模式:代理模式的作用=为其他对象提供一种代理以控制对这个对象的访问。
代理模式的角色:
抽象角色:声明真实对象和代理对象的共同接口
代理角色:代理角色内部包含有真实对象的引用,从而可以操作真实对象。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
动态Proxy是这样的一种类:
它是在运行生成的类,在生成时你必须提供一组Interface给它,然后该class就宣称它实现了这些interface。你可以把该class的实例当作这些interface中的任何一个来用。当然,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。
在使用动态代理类时,我们必须实现InvocationHandler接口

步骤:

1、定义抽象角色

public interface Subject {

public void Request();

}

  

2、定义真实角色

public class RealSubject implements Subject {

@Override

public void Request() {

// TODO Auto-generated method stub

System.out.println("RealSubject");

}

}

  

3、定义代理角色

public class DynamicSubject implements InvocationHandler {

private Object sub;

public DynamicSubject(Object obj){

this.sub = obj;

}

@Override

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

// TODO Auto-generated method stub

System.out.println("Method:"+ method + ",Args:" + args);

method.invoke(sub, args);

return null;

}

}

  

4、通过Proxy.newProxyInstance构建代理对象

RealSubject realSub = new RealSubject();

InvocationHandler handler = new DynamicSubject(realSub);

Class<?> classType = handler.getClass();

Subject sub = (Subject)Proxy.newProxyInstance(classType.getClassLoader(),

realSub.getClass().getInterfaces(), handler);

System.out.println(sub.getClass());         

  

5、通过调用代理对象的方法去调用真实角色的方法。

sub.Request();

输出:

class $Proxy0 新建的代理对象,它实现指定的接口

Method:public abstract void DynamicProxy.Subject.Request(),Args:null

RealSubject 调用的真实对象的方法



评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1 辛苦了

查看全部评分

回复 使用道具 举报
通过调用代理对象的方法去调用真实角色的方法。
回复 使用道具 举报
本帖最后由 黑马唐浩 于 2012-2-9 23:20 编辑

在运行时判断任意一个对象所属的类。
在运行时构造任意一个类的对象。
在运行时判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法
回复 使用道具 举报
反射的作用主要是以后学框架时用的

下边是看张老师视频写的:

1.框架与框架要解决的核心问题:我做房子卖给用户住,由用户自己安装门窗和空调,我做 房子就是框架,用户需要使用的框架,把门窗插入我提供的框架中。框架与工具类有区别,工具类被用户的类调用,而框架则是调用用户提供的类。
2.框架要解决的核心问题:我在写框架(房子)时,你这个用户可能还在上小学,还不会写程序呢。我写的框架程序怎样能调用到你以后写的类(门窗)呢
因为在写程序时无法知道要被调用的类名,所以,在程序中无法直接new某个类的实例对象了,而要用反射方式来做
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马