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");