当前位置: 代码迷 >> 综合 >> 反射之一(静态反射基本概念和应用)
  详细解决方案

反射之一(静态反射基本概念和应用)

热度:39   发布时间:2023-10-15 09:45:21.0

  这是我前几天看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);}@Deprecatedpublic 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());//运行方法,参数一是对象,可以为空,如果调用的方法是静态的可以传nullrun.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());//修改指定成员的值,如果没有权限还是setAccessablePerson 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。