黑马程序员__反射

------<a href="http://www.itheima.com"
target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

<反射>

1.Class

.class文件加载到内存中就是一个Class对象

获取Class对象的方式有3种:

Class.forName();

类名.class

对象.getClass()

例如:

[java] view
plain
copy

  1. public class Demo1_Reflect {
  2. /**
  3. * @param args
  4. * @throws ClassNotFoundException
  5. */
  6. public static void main(String[] args) throws ClassNotFoundException {
  7. Class<?> clazz1 = Class.forName("cn.itcast.bean.Person");
  8. Class<?> clazz2 = Person.class;
  9. Person p = new Person();
  10. Class<?> clazz3 = p.getClass();
  11. System.out.println(clazz1 == clazz2);      //true
  12. System.out.println(clazz2 == clazz3);      //true
  13. }
  14. }

[java] view
plain
copy

  1. public class Demo2_Reflect {
  2. /**
  3. * @param args
  4. *  榨汁机(Juicer)榨汁的案例
  5. * 分别有水果(Fruit)苹果(Apple)香蕉(Banana)桔子(Orange)榨汁(squeeze)
  6. * @throws IOException
  7. * @throws Exception
  8. */
  9. public static void main(String[] args) throws Exception {
  10. BufferedReader br = new BufferedReader(new FileReader("config.txt"));//创建流对象关联config.txt
  11. Class<?> clazz = Class.forName(br.readLine());            //获取该类的字节码对象
  12. Fruit f = (Fruit) clazz.newInstance();              //用字节码文件创建对象
  13. Juicer j = new Juicer();
  14. j.run(f);
  15. }
  16. }
  17. interface Fruit {
  18. public void squeeze();
  19. }
  20. class Apple implements Fruit {
  21. public void squeeze() {
  22. System.out.println("榨出一杯苹果汁儿");
  23. }
  24. }
  25. class Orange implements Fruit {
  26. public void squeeze() {
  27. System.out.println("榨出一杯桔子汁儿");
  28. }
  29. }
  30. class Juicer {
  31. public void run(Fruit f) {
  32. f.squeeze();
  33. }
  34. }

2.Constructor

Class类的newInstance()方法是使用该类无参的构造函数创建对象

调用Class类的getConstructor(String.class,int.class)方法获取一个指定的构造函数,然后再调用Constructor类的newInstance("张三",20)方法创建对象

[java] view
plain
copy

  1. public class Demo3_Constructor {
  2. public static void main(String[] args) throws Exception {
  3. Class<?> clazz = Class.forName("cn.itcast.bean.Person");
  4. Person p = (Person) clazz.newInstance();                     //使用无参的构造函数创建对象
  5. System.out.println(p);

[java] view
plain
copy

  1. Constructor con = clazz.getConstructor(String.class,int.class);//获取有参的构造函数
  2. Person p = (Person) con.newInstance("张三",23);           //创建对象
  3. System.out.println(p);                      //打印对象
  4. }
  5. }

3.Field

Class.getField(String)方法可以获取类中的指定字段(可见的), 如果是私有的可以用getDeclaedField("name")方法获取

通过set(obj, "李四")方法可以设置指定对象上该字段的值, 如果是私有的需要先调用setAccessible(true)设置访问权限

用获取的指定的字段调用get(obj)可以获取指定对象中该字段的值

[java] view
plain
copy

  1. public class Demo4_Field {
  2. public static void main(String[] args) throws Exception {
  3. Class<?> clazz = Class.forName("cn.itcast.bean.Person");
  4. Constructor con = clazz.getConstructor(String.class,int.class);//获取有参的构造函数
  5. Person p = (Person) con.newInstance("张三",23);           //创建对象
  6. /*Field f = clazz.getField("name");
  7. System.out.println(f);*/
  8. Field f = clazz.getDeclaredField("name");           //暴力反射
  9. f.setAccessible(true);                      //去除权限
  10. f.set(p, "李四");
  11. System.out.println(p);
  12. }
  13. }

4.Method

Class.getMethod(String, Class...) 和 Class.getDeclaredMethod(String, Class...)方法可以获取类中的指定方法

调用invoke(Object, Object...)可以调用该方法

Class.getMethod("eat") invoke(obj) Class.getMethod("eat",int.class) invoke(obj,10)

[java] view
plain
copy

  1. public class Demo5_Method {
  2. public static void main(String[] args) throws Exception {
  3. Class<?> clazz = Class.forName("cn.itcast.bean.Person");
  4. Constructor con = clazz.getConstructor(String.class,int.class);//获取有参的构造函数
  5. Person p = (Person) con.newInstance("张三",23);       //创建对象
  6. Method m = clazz.getMethod("eat");
  7. m.invoke(p);
  8. Method m2 = clazz.getMethod("eat", int.class);
  9. m2.invoke(p, 10);
  10. }
  11. }

5.泛型反射

创建一个集合对象,泛型为String类型,需要向这个集合中添加Integer对象

泛型在编译时存在,运行时会被擦除

[java] view
plain
copy

  1. public class Test3 {
  2. public static void main(String[] args) throws Exception {
  3. ArrayList<String> list = new ArrayList<>();
  4. list.add("黑");
  5. list.add("马");
  6. list.add("程");
  7. list.add("员");
  8. Class<?> clazz = Class.forName("java.util.ArrayList");        //获取字节码文件
  9. Method m = clazz.getMethod("add", Object.class);        //获取方法
  10. m.invoke(list, 521);                        //执行方法
  11. m.invoke(list, true);
  12. System.out.println(list);
  13. }
  14. }
时间: 2024-12-13 09:58:24

黑马程序员__反射的相关文章

黑马程序员__反射_内省_动态代理

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 1.Class .class文件加载到内存中就是一个Class对象 获取Class对象的方式有3种: Scanner sc = newScanner("xxx.txt"); Class.forName(sc.nextL

黑马程序员__反射总结

------Java培训期待与您交流! ------- 简而言之反射 就是Java类中的各种成分映射成相应的java类. 反射是加载类的class文件并解析里面的数据.利用反射技术可以对一个类进行解剖把各个组成部分映射成一个个对象. 1.Class类 Class: 根据所有类的class文件所抽象出的类型如何得到某个class文件对应的class对象.Class.forName("类名") 用全类名. 1.1Class类的常用方法 Field getField(String name)

黑马程序员——高新技术---反射

黑马程序员——高新技术---反射 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 反射把Java类中的各种成分映射成相应的Java类,例如一个Java类中用一个Class类的对象表示,一个类中的组成部分:成员变量,方法,构造方

黑马程序员_Java反射机制

一切的操作都将使用Object完成,类,数组的引用都可以使用Object来接收 1,认识Class类 以前要是想知道一个类中的属性,成员变量,方法等等的信息的话,需要通过new这个类的对象才能得到这些信息,但是在Java中,也允许一个实例化对象找到一个类的完整的信息,这个类就是Class类,Class类是继承Object类的. 正常方式:  引入需要的"包.类"名称 >取得实例化对象 反射方式:  实例化对象>得到完整的"包.类"名称 getClass(

黑马程序员------Java反射学习总结(一)

-------------------------Java培训.Android培训,期待与您交流!----------------------------- 一.反射的概念 1) Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 2)一句话来讲,反射就是将Java类中的各个成分映射成相应的Java类. 3)即在Java中,描述事物的各种

黑马程序员__多线程

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 1.线程是程序执行的一条路径, 一个进程中可以包含多条线程,多线程并发执行可以提高程序的效率, 可以同时完成多项工作. 2.开启新线程的两种方式 1).继承Thread [java] view plaincopy public stati

黑马程序员_反射(一)

/*1.反射:反射处理的对象是内存中的java类,即一个类的字节码对象.  该字节码对象是这个类在内存中的代表.            一个类是否加载到内存中来,就看内存中是否有这个类的字节码.           该字节码对象是用来创建其代表的类的实例对象的.           这个字节码对象也是用一个java类来描述的,叫做Class类,即Class类是用来描述java类的,java类这            一类事物有“类名”,“构造方法”,“方法列表”,“字段列表”,“访问权限”,“父

黑马程序员__集合框架总结

------Java培训期待与您交流! ------- 前言: 本文是对Java集合框架做了一个概括性的解说,目的是对Java集合框架体系有个总体认识,如果你想学习具体的接口和类的使用方法,请参看Java API文档. 一.概述 数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作的方法. 在Java语言中,Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口

黑马程序员_反射

反射 1.由来: 程序后期扩展,无源码修改的扩展 2.java.lang.Class 描述.class的类 java.lang.reflect.Constructor  描述构造方法的类 java.lang.reflect.Field 描述成员变量的类 java.lang.reflect.Method 描述成员方法的类 3.实现反射: A.获取class文件对象 第一种:通过对象获取 Person p=new Person(); Object中getClass(),返回值是Class类型 第二种