这是我前几天看java基础视频里面看到的,然后我感觉以后或许有用,就先转载进来。反射分为静态反射和动态代理。我这里写的是静态反射的基本概念和一些基本方法。我直接贴代码,有用的东西都在代码里面。
public class Person {
private static final String TAG = "Person===";
private String name;
public int age;
public Person() {
}
public Person(String name, int age) {
}
public void run(String run) {
System.out.println(run);
}
private void test(String test) {
System.out.println(test);
}
@Deprecated
public void test2(String name, Integer age) {
System.out.println(name + "今年" + age + "岁");
}
}
public class Main {
//成员方法
public static void main(String[] args) {
// Class<Person> personClass = Person.class;
// Class<?> aClass = Class.forName("....person");
Person person = new Person();
Class<? extends Person> clazz = person.getClass();
//返回所有的公有的方法
Method[] methods = clazz.getMethods();//获取所有的公有方法,包括父类的方法
Method[] methods1 = clazz.getDeclaredMethods();//获取所有的方法,包括私有,但是不包括父类的方法
for (Method method : methods1) {
String name = method.getName();//获取方法名
int modifiers = method.getModifiers();//获取方法修饰符
String modfier = Modifier.toString(modifiers);
Class<?> returnType = method.getReturnType();//获取返回值类型
String simpleName = returnType.getSimpleName();
Class<?>[] parameterTypes = method.getParameterTypes();//获取入参类型
StringBuilder stringBuilder = new StringBuilder();//StringBuilder线程不安全,不可以在多线程中使用,但是效率高;StrngBuffer线程安全
stringBuilder.append("(");
for (Class params : parameterTypes) {
stringBuilder.append(params.getSimpleName() + ",");
}
stringBuilder.append(")");
System.out.println(modfier + " " + simpleName + " " + name + stringBuilder);
}
System.out.println("=====================================");
try {
//获取公有的方法,参数一是方法名,参数二是可变参数,参数类型
Method run = clazz.getMethod("run", String.class);
Method test2 = clazz.getMethod("test2", String.class, Integer.class);
System.out.println(run.getName() + "---" + test2.getName());
//获取所有指定的的方法,包括私有,不包括父类方法
Method test = clazz.getDeclaredMethod("test", String.class);
System.out.println(test.getName());
//运行方法,参数一是对象,可以为空,如果调用的方法是静态的可以传null
run.invoke(new Person(), "run");
test2.invoke(new Person(), "liyi", 24);
test.setAccessible(true);//修改权限
test.invoke(new Person(), "test");//私有方法不可以直接访问,需要需改权限修饰符
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class Main2 {
//成员变量
public static void main(String[] args) {
try {
Class<?> clazz = Class.forName("shen.da.ye.reflect.Person");
//获取公有成员变量,不包括父类的
Field[] fields = clazz.getFields();
Field[] fields1 = clazz.getDeclaredFields();//包括私有的
for (Field field : fields1) {
String name = field.getName();//变量名
int modifiers = field.getModifiers();
String modifier = Modifier.toString(modifiers);
Class<?> type = field.getType();
System.out.println(modifier + " " + type.getSimpleName() + " " + name);
}
//获取公有指定的成员
Field age = clazz.getField("age");
Field TAG = clazz.getDeclaredField("TAG");
System.out.println(age.getName() + "===" + TAG.getName());
//修改指定成员的值,如果没有权限还是setAccessable
Person person = new Person();
age.set(person, 23);
System.out.println(person.age);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class Main3 {
//构造
public static void main(String[] args) {
Class<Person> clazz = Person.class;
Constructor<?>[] constructors = clazz.getConstructors();//获取所有公有的构造函数
Constructor<?>[] constructors1 = clazz.getDeclaredConstructors();//获取所有的构造函数
for (Constructor constructor : constructors) {
String name = constructor.getName();
int modifiers = constructor.getModifiers();
String modifier = Modifier.toString(modifiers);
Class[] parameterTypes = constructor.getParameterTypes();
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("(");
for (Class params : parameterTypes) {
stringBuilder.append(params.getSimpleName() + ",");
}
stringBuilder.append(")");
System.out.println(modifier + " " + name + stringBuilder);
try {
Constructor<Person> constructor1 = clazz.getConstructor(String.class, int.class);//获取指定公有的构造方法
Constructor<Person> constructor2 = clazz.getDeclaredConstructor(String.class, int.class);//获取所有指定的构造函数
System.out.println(constructor2.getName());
Person person2 = (Person) constructor.newInstance();//如果调私有设置access
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
等我有空把视频看完再把动态代码写成一篇转载blog。