Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;这种动态获取信息以 及动态调整对象方法的功能称为 java 语言的反射机制。
package top.hkf.hblog; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectDemo { public static void main(String[] args) throws Exception{ Class catClass = Class.forName("top.hkf.hblog.TomCat"); TomCat cat = (TomCat) catClass.newInstance(); System.out.println("Class name is " + catClass.getName()); //所有的方法都能获取,但是不能获取到继承的和实现接口的方法 Method getHello = catClass.getDeclaredMethod("throwHello", String.class); //私有的方法需要设置为 true getHello.setAccessible(true); Object str = getHello.invoke(cat, "Bob"); System.out.println("getHello result is " + str); //能获取 public 方法,包括继承的和实现接口的方法 Method sayHi = catClass.getMethod("sayHi", String.class); sayHi.invoke(cat, "Welcome"); //获取属性 Field name = catClass.getDeclaredField("name"); name.setAccessible(true); name.set(cat, "tom"); sayHi.invoke(cat, "Welcome"); } } class TomCat { private String name; public void sayHi(String helloSentence) { System.out.println(helloSentence + " " + name); } private String throwHello(String tag) { return "Hello " + tag; } static { System.out.println("Hello TomCat"); } }
ClassLoader.loadClass()与Class.forName()的区别
resolve参数(classLoder的resolve参数默认是false,forName为true,对类进行链接和初始化)
Class.forName 得到的 class 时已经初始化完成的 ClassLoader.loadClass 得到的 class 是还没有连接的,Spring 的延迟加载使用 classloder.loadClass
//Driver 中也是有静态代码块初始化了的; Class.forName("com.mysql.jdbc.Driver");