ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] > ### `java.lang.Class` * 所有的反射都要从类 `java.lang.Class`开始进行,而最关键的是这个类有三种实例化方法: * 调用`Object`类中的`getClass()`方法: ``` import java.util.Date; public class ReflectTest { public static void main(String[] args) { Date date = new Date(); Class<?> cls = date.getClass(); System.out.println(cls); } } "class java.util.Date" ``` * 使用`类.class`取得: ``` import java.util.Date; public class ReflectTest { public static void main(String[] args) { Class<?> cls = Date.class; System.out.println(cls); } } "class java.util.Date" ``` * 通过`Class.forName("com.xxx.ClassName")` ``` public class ReflectTest5 { public static void main(String[] args) throws ClassNotFoundException { Class<?> cls = Class.forName("java.util.Date"); System.out.println(cls); } } "class java.util.Date" ``` <br/> > ### 反射类实例化对象 ``` Class<?> cls = Class.forName("java.util.Date"); Object date = cls.newInstance(); ``` <br/> > ### 通过反射实现的工厂模式 * 在`Factory`类中通过`className`反射出类并实例化对象,实现了`Factory`与`Fruit`接口实现类的解耦,当`Fruit`新增时无需修改`Factory`类。 ``` // 转自 https://juejin.im/post/5ab99b10f265da239c7b5e52 interface Fruit{ void eat(); } class Apple implements Fruit{ @Override public void eat() { System.out.println("* 吃苹果 *"); } } class Orange implements Fruit{ @Override public void eat() { System.out.println("* 吃橘子 *"); } } class Factory{ public static Fruit getInstance(String className){ Fruit f = null; try { // 根据className反射出类并实例化对象 // 优化了Factory,与Fruit接口的实现类解耦 // 若不使用反射,则需要程序判断className并new相应的实例,当Fruit新增时,Factory也要修改 f = (Fruit) Class.forName(className).newInstance(); } catch (Exception e) { e.printStackTrace(); } return f; } } public class TestFactory { public static void main(String[] args) { Fruit f = Factory.getInstance("com.jkx.lzh.test.Apple"); f.eat(); } } ``` <br/> > ### 获取类的所有变量信息 > ### 获取类的所有方法信息 > ### 访问或操作类的私有变量和方法 <br/> <br/> *** 参考: [浅析JAVA反射](https://juejin.im/post/5ab99b10f265da239c7b5e52) [Java 反射由浅入深 ](https://juejin.im/post/598ea9116fb9a03c335a99a4)