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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴雨翔 黑马帝   /  2011-11-25 19:14  /  1758 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 吴雨翔 于 2011-11-25 19:28 编辑

老师讲的不好理解,谁给一个简单的反射实例

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

6 个回复

正序浏览
颜小飞 黑马帝 2011-11-26 11:24:35
7#
反射就是把java语言中的的类的各种组成部分映射到一个Class类型的类中。然后通过这个Class类型的类来得到java类的各种组成信息。
回复 使用道具 举报
.反射
1.获取Class对象:
Class类是用来描述一个类的类, 当程序运行时虚拟机加载.class文件到内存中, 在内存中这些.class文件就是Class类的对象.
我们如果获得了Class对象, 就可以使用这个对象的newInstance()方法来创建该类的实例.
获取Class对象的方式有3种:
a.通过字符串获取: Class.forName(String)
b.通过类名直接获取: 类名.class
c.通过对象获取: 对象.getClass()
2.构造函数Constructor:
如果一个Class对象中有无参构造函数, 那么可以直接使用Class对象的newInstance()方法来创建对象.
但是如果没有无参的构造函数, 那么就需要调用其有参的构造函数来创建对象了.
使用Class类的getConstructor(Class...)方法获取到指定的构造函数.
通过Construtor类的newInstance(Object...)方法来调用构造函数创建对象.
3.方法Method:
我们可以通过Class对象获取一个类中的方法. 获取到方法之后可以运行该方法.
可见的方法:
通过Class类的getMethod(String, Class...)方法获取指定的方法.
通过Method的invoke(Object, Object...)方法调用该方法.
类中定义的方法(包括不可见的):
通过Class类的getDeclaredMethod(String, Class...)方法获取到该类定义的一个方法
如果该方法是一个不可见的方法, 那么需要设置该方法的可见性, setAccessible(boolean)
4.属性Field:
我们可以通过Class对象获取该类中的属性, 可以设置或获取该属性的值.
可见的属性:
通过Class对象的getField(String)方法获取到Field对象
通过Field对象的set(Object, Object)设置该属性的值
类中定义的(包括不可见的):
通过Class对象的getDeclaredField(String)方法获取到Field对象
如果该属性是不可见的, 那么需要设置可见性才能操作. setAccessible(boolean)



/*
* Person 类用来描述人
* Student 类用来描述学生
* String 类用来描述字符串
* Class 类用来描述所有的.class文件
*/
public class ClassDemo {

        public static void main(String[] args) throws Exception {
                //                demo1();
                //                demo2();
                //                demo3();
                //                demo4();
        }

        private static void demo4() throws ClassNotFoundException {
                Apple apple = new Apple();

                Class clazz1 = Class.forName("cn.itcast.day29.reflect.Apple");
                Class clazz2 = Apple.class;
                Class clazz3 = apple.getClass();

                System.out.println(clazz1);
                System.out.println(clazz2);
                System.out.println(clazz3);

                System.out.println(clazz1 == clazz2);
                System.out.println(clazz2 == clazz3);

                // 以上3种方式获取的都是Apple类, 是同一个对象
        }

        private static void demo3() throws InstantiationException, IllegalAccessException {
                //
                Object obj = new Apple();
                Class<?> clazz = obj.getClass();
                //执行完上面两步后,就可以获得一个Class对象
                //使用这个Class对象就可以创建Apple对象了
                Fruit fruit = (Fruit) clazz.newInstance();
                fruit.squeeze();
        }

        private static void demo2() throws InstantiationException, IllegalAccessException {
                Class<?> clazz = Apple.class;
                Fruit fruit = (Fruit) clazz.newInstance();
                fruit.squeeze();
        }

        private static void demo1() throws FileNotFoundException, ClassNotFoundException, IOException, InstantiationException, IllegalAccessException {
                BufferedReader br = new BufferedReader(new FileReader("config.txt"));

                // 获取到一个Class对象
                Class clazz = Class.forName(br.readLine());

                // 通过Class对象创建该类的一个实例
                Fruit fruit = (Fruit) clazz.newInstance();

                // 调用该对象的方法
                fruit.squeeze();
        }

}

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1

查看全部评分

回复 使用道具 举报
来个复杂的—通过反射为JavaBean中的属性赋值:
  1. public class My2 {
  2.         public static void main(String args[]) throws Exception
  3.         {
  4.                 Person per=new Person();
  5.                 PropertyDescriptor pd=new PropertyDescriptor("name",Person.class);
  6.                 Method setMethod=pd.getWriteMethod();
  7.                 setMethod.invoke(per, "Jim");
  8.                 System.out.println(per.getName());
  9.         }
  10. }
  11. class Person
  12. {
  13.         private String name;

  14.         public String getName() {
  15.                 return name;
  16.         }

  17.         public void setName(String name) {
  18.                 this.name = name;
  19.         }
  20.        
  21. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
通过反射机制得到往ArrayList<Integer>中加入String元素:
  1. public class My2 {
  2.         @SuppressWarnings("unchecked")
  3.         public static void main(String args[]) throws Exception
  4.         {
  5.                 ArrayList<Integer> array=ArrayList.class.newInstance();
  6.                 Method method=array.getClass().getMethod("add", Object.class);
  7.                 method.invoke(array, "abc");
  8.                 System.out.println(array.get(0));
  9.         }
  10. }
复制代码
回复 使用道具 举报
一个简单的通过反射机制得到String的所有方法:
  1. public class My2 {
  2.         public static void main(String args[])
  3.         {
  4.                 Class<?> cl=String.class;
  5.                 Method[] methods=cl.getMethods();
  6.                 for(Method method:methods)
  7.                 {
  8.                         System.out.println(method.toString());
  9.                 }
  10.         }
  11. }
复制代码
回复 使用道具 举报
一个简单的通过反射机制得到String的所有构造方法:
  1. public class My2 {
  2.         public static void main(String args[])
  3.         {
  4.                 Class cl=String.class;
  5.                 Constructor[] cons=cl.getConstructors();
  6.                 for(Constructor con:cons)
  7.                 {
  8.                         System.out.println(con.toString());
  9.                 }
  10.         }
  11. }
复制代码

评分

参与人数 2技术分 +2 黑马币 +1 收起 理由
宁超 + 2
吴雨翔 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马