反射就是动态加载对象
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException {
Ag ag = new Ag();
// 三种方式获取Class,后两种必须要实例
Class c1 = Class.forName("com.xinbo.jcmk02.service.impl.Ag");
Class c2 = ag.getClass();
Class c3 = Ag.class;
System.out.println("名字" + c1.getName());
Ag ag1 = (Ag) c1.newInstance();
// 获取公共类属性
Field[] fields = c1.getFields();
for (Field f: fields) {
System.out.println("属性" + f.getName());
}
Field[] declaredFields = c1.getDeclaredFields();
for (Field f: declaredFields) {
System.out.println("属性" + f.getName());
}
Field a = c1.getDeclaredField("a");
// 取消java访问检查
a.setAccessible(true);
System.out.println(a.getName());
// 获取方法、私有方法同上
Method[] methods = c1.getMethods();
// 如果有参数,则在getMethod后面加参数类型
Method gettt = c1.getMethod("gettt");
gettt.invoke(ag1, null);
Ag o = (Ag)c1.newInstance();
o.setA("ge");
// 构造方法
Constructor[] constructors = c1.getConstructors();
for (Constructor c:constructors) {
System.out.println(c.getName());
}
// 获取父类,通过调用getSuperclass
Class superclass = c1.getSuperclass();
Field[] fields1 = superclass.getFields();
for (Field f: fields1) {
System.out.println(f.getName());
}
}
}
class Ag extends TT{
private String a = "ggg";
public Ag() {
}
public void gettt() {
System.out.println("执行方法");
}
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
}
class TT {
public String gg = "ggg";
}
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Class clazz = classLoader.loadClass( "com.rhlyiot.domain.AssembelProgress" );
AssembelProgress o = (AssembelProgress)clazz.newInstance();
Field id = clazz.getDeclaredField( "id" );
//取消java访问检查
id.setAccessible( true );
id.set( o, "123" );
//访问方法
Method aa = clazz.getDeclaredMethod( "aa", (Class[]) null );
//执行方法
aa.setAccessible( true );
aa.invoke( o,(Object[]) null );