获取类对象3种方式:
1. Class.forName("className")
2. ClassName.class
3. new ClassName().getClass()
创建对象:
传统方式:
Hero h1 = new Hero();
反射方式:
Class pClass = Class.forName("charactor.Hero"); //构造器 Constructor c= pClass.getConstructor(); (也可以不用构造器;相当于调用无参构造方法) //通过构造器实例化 Hero h2= (Hero) c.newInstance();
访问属性:
//获取类Hero的名字叫做name的字段 Field f1= h.getClass().getDeclaredField("name"); //修改这个字段的值 f1.set(h, "teemo");
调用方法:
// 获取这个类的名字叫做setName,参数类型是String的方法 Method m = h.getClass().getMethod("setName", String.class); // 对h对象,调用这个方法 m.invoke(h, "盖伦");
参考:how2j-反射机制
反射的作用:
当我们的程序在运行时,需要动态的加载一些类这些类可能之前用不到所以不用加载到jvm,举个例子我们的项目底层有时是用mysql,有时用oracle,需要动态地根据实际情况加载驱动类,这个时候反射就有用了,假设 com.java.dbtest.myqlConnection,com.java.dbtest.oracleConnection这两个类我们要用,这时候我们的程序就写得比较动态化;
通过Class tc=Class.forName("com.java.dbtest.TestConnection"); 通过类的全类名让jvm在服务器中找到并加载这个类,而如果是oracle则传入的参数就变成另一个了。这时候就可以看到反射的好处了,这个动态性就体现出java的特性了!
(编译时不需要知道具体的类,运行时才知道是哪个类,调用该类方法)
参考:知乎-反射作用