黑马程序员技术交流社区

标题: java使用反射的方式创建实例和调用方法 [打印本页]

作者: 史超    时间: 2013-12-5 10:09
标题: java使用反射的方式创建实例和调用方法
package Test;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class test2 {
        public static void main(String args[]) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException
        {
                Person p = new Person();
                Class c = p.getClass();
                Method m = c.getMethod("setAge", String.class);
                m.invoke(p, "21");
                System.out.println("age:"+p.getAge());
        }
}

class Person
{
         private String name;
         private String age;
         public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
        public String getAge() {
                return age;
        }
        public void setAge(String age) {
                this.age = age;
        }
       
}


问题:
1,反射机制是什么?
2,为什么要用到反射机制? 上面的例子完全可以new出来用get \ set方法来获取和定义属性值,但是用“反射”,有什么不同之处?

新手,愿听详解,谢谢!



作者: 几番意难相付    时间: 2013-12-5 10:27
首先 你的源码有一处错误m.invoke(p, "21");既然你的姓名和年龄都是String类型 那么在p字符的前后 也应该加上""
1 反射根据我自己的理解 是通过一个类的相关信息诸如类名,实例对象,等来获取类中的方法和元素的一种 机制。
2 为什么要用到反射?为了提高程序的扩展性 你知道 当你在编写源码的时候 自己建立了一个javabean 就是你的person类 建好以后 可以方便的用person p=new person()来建立person对象 但如果是这种情况

你的程序已经封装完成 交给了客户 如果客户想用person来建立对象 怎么办?直接拿你的源码来建立么?不太可能吧 这时候反射就派上用场了 只要获取了person的Class对象 就可以建立person对象 而获取Class对象则简单多了 可以通过person.getClass()  Class.forName("com.itheima.person");person.class
然后可以通过设置配置文件的方式 给person赋值 如姓名 年龄
经常见到一些程序 目录下有配置文件 当你配置好以后 程序运行的时候 就可以使用你所配置的参数 而程序编写的时候 根本不知道以后用这个程序的人会给一些什么参数给他 所以提供了配置文件 这也是反射机制的一种具体实现

作者: 王家胜    时间: 2013-12-5 16:07
new 就不必用反射了,和ScriptManager类一样,用来执行java代码的,ScriptManager功能多些,反射强悍些




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