黑马程序员技术交流社区

标题: 关于java中反射 [打印本页]

作者: 小流氓123    时间: 2014-4-16 21:08
标题: 关于java中反射
请问java什么是反射!反射又那些功能与好处!没搞懂
作者: ^o(孤8o|狼i¤F    时间: 2014-4-16 21:13
JAVA反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
1. 得到某个对象的属性
Java代码  
public Object getProperty(Object owner, String fieldName) throws Exception {  
     Class ownerClass = owner.getClass();  
   
     Field field = ownerClass.getField(fieldName);  
   
     Object property = field.get(owner);  
   
     return property;  
}  

Class ownerClass = owner.getClass():得到该对象的Class。

Field field = ownerClass.getField(fieldName):通过Class得到类声明的属性。

Object property = field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。
作者: 也许依然    时间: 2014-4-17 11:26
1 反射就是把Java类中的各种成分映射成相应的java类。
2 例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。
3 表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field、Method、Contructor、Package等等。

Constructor类
Constructor类代表某个类中的一个构造方法
得到某个类所有的构造方法:
    例子:Constructor [] constructors= Class.forName("java.lang.String").getConstructors();
得到某一个构造方法:
    例子:Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);
创建实例对象:
    通常方式:String str = new String(new StringBuffer("abc"));
    反射方式: String str = (String)constructor.newInstance(new StringBuffer("abc"));

Field类
Field类代表某个类中的一个成员变量
代码示例:
ReflectPoint point = new ReflectPoint(1,7);
Field x = Class.forName("cn.itcast.corejava.ReflectPoint").getField("x");
所以字段fieldX 代表的是x的定义,而不是具体的x变量。

Method类
Method类代表某个类中的一个成员方法
得到类中的某一个方法:
    Method charAt = Class.forName("java.lang.String").getMethod("charAt", int.class);
调用方法:
    通常方式:System.out.println(str.charAt(1));
    反射方式: System.out.println(charAt.invoke(str, 1));
如果传递给Method对象的invoke()方法的第一个参数为null,这有着什么样的意义呢?说明该Method对象对应的是一个静态方法!

作者: 清风有意    时间: 2014-4-17 12:33
每个人都是慢慢成长的,我刚开始也没有看懂!但是多看了两遍,就看的差不多了。
然后再敲敲代码,能从中了解到反射到底是干什么的!有什么是别的类不能干的,每个功能都要有所归属不是吗?不要想的太难了!
有的人是以百度为老师,有的人是以论坛为老师,每个人都有自己的学习方法。
总的来说,世界上的事都不难,只要你想学。

还有,不能只是兴趣让你从事某一职业。而是根据你的兴趣能从中获得基本的生存条件。人总是要吃饭的。
有的人开心的吃,有的人闷闷不乐的吃,心态和目标很重要。
茫茫大海之中,没有方向的话,心神都随之衰落。
当有一瞭望塔出现在视野里,即便它离你万里之远,你也会有前进的动力。

作者: 小流氓123    时间: 2014-4-25 20:42
清风有意 发表于 2014-4-17 12:33
每个人都是慢慢成长的,我刚开始也没有看懂!但是多看了两遍,就看的差不多了。
然后再敲敲代码,能从中了 ...

谢谢!其实都不容易




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2