获取类的运行时结构
package com.reflection;
/**
* 获取运行时类的完整结构
* 通过反射获取运行时类的完整结构
* Field Method Constructor Superclass Interface Annotation
* 实现的全部接口、所继承的父类、全部的构造器、全部的方法、全部的Field、注解
* @author 长空扯淡
*/
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test05 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
Class c1 = Class.forName("com.reflection.User");
/* User user = new User();
c1 = user.getClass();
*/
//获得类的名字
System.out.println(c1.getName());
System.out.println(c1.getSimpleName());
//获得类的属性
Field[] fields = c1.getFields(); //只能找到public属性
fields = c1.getDeclaredFields(); //找到全部属性
for (Field field : c1.getDeclaredFields()){
System.out.println(field);
}
//获得指定属性的值
Field name = c1.getDeclaredField("name");
System.out.println(name);
//获得类的方法
System.out.println("===================================================");
Method[] methods = c1.getMethods(); //获得本类及其父类的全部public方法
for (Method method:methods){
System.out.println("正常的:"+method);
}
methods = c1.getDeclaredMethods(); //获得本类的所有方法
for (Method method:methods){
System.out.println("getDeclaredMethods:"+method);
}
//获得指定方法
//重载
Method getName = c1.getMethod("getName",null);
Method setName = c1.getMethod("setName",String.class);
System.out.println(getName);
System.out.println(setName);
//获得的构造器
System.out.println("===================================================");
Constructor[] constructors = c1.getConstructors();
for (Constructor constructor : constructors){
System.out.println(constructor);
}
Constructor[] constructors1 = c1.getDeclaredConstructors();
for (Constructor constructor:constructors1){
System.out.println(constructor);
}
//获得指定的构造器
Constructor declaredConstructor = c1.getDeclaredConstructor(String.class, int.class);
System.out.println("指定:"+declaredConstructor);
}
}
动态创建对象执行方法
package com.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test06 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
//获得Class对象
Class c1 = Class.forName("com.reflection.User");
/*
//构造一个对象----若User类中有无参构造,这种方法才有用,否者会报错
User user = (User)c1.newInstance();
System.out.println(user);
*/
/*
//没有无参构造,也可以通过构造器创建对象
Constructor constructor = c1.getDeclaredConstructor(String.class, int.class);
User user2 = (User)constructor.newInstance("一叶知秋", 20);
System.out.println(user2);
*/
//通过反射调用普通方法
User user3 = (User)c1.newInstance();
//通过反射获取一个方法
Method setName = c1.getDeclaredMethod("setName", String.class);
//invoke激活的意思 (对象,"方法的值")
setName.invoke(user3,"大漠孤烟");
System.out.println(user3.getName());
System.out.println("---------------------------------------------");
//通过反射操作属性
User user4 = (User)c1.newInstance();
Field name = c1.getDeclaredField("name");
//不能直接操作私有属性,需要关闭程序的安全检测,属性或者方法的setAccessible(true) 设置为true
name.setAccessible(true);// Accessible 是可进入的意思
name.set(user4,"夜雨声烦");
System.out.println(user4.getName());
}
}