一:目标
Ø理解 Class 类
Ø理解 Java 的类加载机制
Ø学会使用 ClassLoader 进行类加载
Ø理解反射的机制
Ø掌握 Constructor、Method、Field 类的用法
Ø理解并掌握动态代理
1、Class类
Person类
ReflectionTest类
party.properties
EveningParty.java
Singing 接口
Dancing 接口
Xiangsheng 接口
歌手刘德华
歌手谢霆锋
舞者杨丽萍
舞者郭富城
相声演员郭德纲
Factory
–对象照镜子后可以得到的信息:某个类的数据成员名、方法和构造器、某个类到底实现了哪些接口。
对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。
一个 Class 对象包含了特定某个类的有关信息。
– Class 对象只能由系统建立对象。
– 一个类在 JVM 中只会有一个Class实例。
– 每个类的实例都会记得自己是由哪个 Class 实例所生成 。
获取 Class 对象的方式:
Class类的常用方法:
三种类加载器(ClassLoader):
练习代码:
1 package com.shellway.test; 2 3 public class Person { 4 String name; 5 String age; 6 7 public String getName() { 8 return name; 9 } 10 11 public void setName(String name) { 12 this.name = name; 13 } 14 15 public String getAge() { 16 return age; 17 } 18 19 public void setAge(String age) { 20 this.age = age; 21 } 22 23 public Person(String name, String age) { 24 super(); 25 this.name = name; 26 this.age = age; 27 System.out.println("有参数的构造器。。。。"); 28 } 29 30 public Person() { 31 System.out.println("无参数的构造器。。。。"); 32 } 33 }
1 package com.shellway.test; 2 3 import static org.junit.Assert.*; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.InputStream; 7 import java.lang.reflect.Field; 8 import org.junit.Test; 9 10 public class ReflectionTest { 11 @Test 12 public void testClassLoader() throws ClassNotFoundException, 13 FileNotFoundException { 14 ClassLoader classLoader = ClassLoader.getSystemClassLoader(); 15 System.out.println(classLoader); 16 classLoader = classLoader.getParent(); 17 System.out.println(classLoader); 18 classLoader = classLoader.getParent(); 19 System.out.println(classLoader); 20 21 // 测试由哪个类加载器进行加载 22 classLoader = Class.forName("com.shellway.test.Person") 23 .getClassLoader(); 24 System.out.println(classLoader); 25 26 // 调用getResourceAsStream获取类路径下文件对应的输入流 27 InputStream in = null; 28 in = this.getClass().getClassLoader() 29 .getResourceAsStream("com/shellway/test/test.properties"); 30 // new FileInputStream("com/shellway/test/test.properties"); 31 System.out.println(in); 32 } 33 34 @Test 35 public void testNewInstance() throws ClassNotFoundException, 36 InstantiationException, IllegalAccessException { 37 String className = "com.shellway.test.Person"; 38 Class clazz = Class.forName(className); 39 Object obj = clazz.newInstance();// 实际上调用的是无参数的构造器创建的实例。 40 System.out.println(obj); 41 } 42 43 @Test 44 public void test() throws ClassNotFoundException { 45 // 1.得到Class对象的三种方法 46 // 1.1直接通过类名.class的方式得到 47 Class clazz = null; 48 clazz = Person.class; 49 Field[] fields = clazz.getDeclaredFields(); 50 System.out.println(clazz); 51 52 // 2.1通过对象调用getClass()方法来获取 53 Person person = new Person();// Object obj =new Person(); 54 clazz = person.getClass(); // clazz = obj.getClass(); 55 56 // 3.1通过全类名的方式获取,用的最多的 57 String className = "com.shellway.test.Person"; 58 clazz = Class.forName(className); 59 } 60 }
利用反射写一个晚会案例:
1 Singing=com.shellway.Reflection.impl.Liudehua 2 Dancing=com.shellway.Reflection.impl.Guofucheng 3 Xiangsheng=com.shellway.Reflection.impl.Guodegang
1 package com.shellway.Reflection; 2 3 import com.shellway.Reflection.imp.Dancing; 4 import com.shellway.Reflection.imp.Singing; 5 import com.shellway.Reflection.imp.Xiangsheng; 6 7 public class EveningParty { 8 public static void main(String[] args) throws Exception { 9 System.out.println("晚会开始!!!!!"); 10 //唱歌 11 Singing sing = Factory.getSinger(); 12 sing.singing(); 13 //跳舞 14 Dancing dancing = Factory.getDancer(); 15 dancing.dancing(); 16 //相声 17 Xiangsheng xiangsheng = Factory.getPerformer(); 18 xiangsheng.show(); 19 System.out.println("晚会结束!!!!!"); 20 } 21 }
1 package com.shellway.Reflection.imp; 2 3 public interface Singing { 4 public void singing(); 5 }
1 package com.shellway.Reflection.imp; 2 3 public interface Dancing { 4 void dancing(); 5 }
1 package com.shellway.Reflection.imp; 2 3 public interface Xiangsheng { 4 void show(); 5 }
接口实现类:
1 package com.shellway.Reflection.impl; 2 3 import com.shellway.Reflection.imp.Singing; 4 5 public class Liudehua implements Singing { 6 7 @Override 8 public void singing() { 9 System.out.println("刘德华演唱:中国人"); 10 } 11 }
1 package com.shellway.Reflection.impl; 2 3 import com.shellway.Reflection.imp.Singing; 4 5 public class Xietingfeng implements Singing { 6 7 @Override 8 public void singing() { 9 System.out.println("谢霆锋演唱:因为爱所以爱..."); 10 } 11 }
1 package com.shellway.Reflection.impl; 2 3 import com.shellway.Reflection.imp.Dancing; 4 5 public class Yangliping implements Dancing { 6 7 @Override 8 public void dancing() { 9 System.out.println("杨丽萍表演孔雀舞..."); 10 } 11 }
1 package com.shellway.Reflection.impl; 2 3 import com.shellway.Reflection.imp.Dancing; 4 5 public class Guofucheng implements Dancing { 6 7 @Override 8 public void dancing() { 9 System.out.println("郭富城跳广场舞..."); 10 } 11 }
1 package com.shellway.Reflection.impl; 2 3 import com.shellway.Reflection.imp.Xiangsheng; 4 5 public class Guodegang implements Xiangsheng { 6 7 @Override 8 public void show() { 9 System.out.println("郭德纲表演相声..."); 10 } 11 }
工厂类与配置文件结合实现反射
1 package com.shellway.Reflection; 2 3 import java.util.ResourceBundle; 4 5 import com.shellway.Reflection.imp.Dancing; 6 import com.shellway.Reflection.imp.Singing; 7 import com.shellway.Reflection.imp.Xiangsheng; 8 9 public class Factory { 10 11 public static Singing getSinger() throws Exception{ 12 String pathName = ResourceBundle.getBundle("party").getString("Singing"); 13 Object obj = Class.forName(pathName).newInstance(); 14 return (Singing) obj; 15 } 16 public static Dancing getDancer() throws Exception{ 17 String pathName = ResourceBundle.getBundle("party").getString("Dancing"); 18 Object obj = Class.forName(pathName).newInstance(); 19 return (Dancing) obj; 20 } 21 22 public static Xiangsheng getPerformer() throws Exception{ 23 String pathName = ResourceBundle.getBundle("party").getString("Xiangsheng"); 24 Object obj = Class.forName(pathName).newInstance(); 25 return (Xiangsheng) obj; 26 } 27 28 }