欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

反射:动态与静态衍生的反射

程序员文章站 2022-05-10 17:26:27
...

                                            Reflection反射

 

=================================================================================

【概念】:

 1、Java反射的概念
  反射含义:可以获取正在运行的Java对象。
  2、Java反射的功能
  1)可以判断运行时对象所属的类
  2)可以判断运行时对象所具有的成员变量和方法
  3)通过反射甚至可以调用到private的方法
  4)生成动态代理
 =======================================================================================

【有什么用】:

            举一个简单的例子:

我们在eclipse新建一个类及其方法属性时,下面调用对象方法以及属性时,直接一个点,就会给我们列出它所有的类和方法,这就是利用了java的反射机制。对一个类的自审,

现在我们运行的所有的程序都是在编译期的时候就已经知道了你所需要的那个类的已经被加载了 

【一个准女婿要见未婚妻家人的故事引出】:

譬如 A a=new A();

         a.put(2);

这个是在编译阶段完成对a类型的解析,对a是不是有put方法进行了判断,如果a对象没有put方法,则编译不通过。

可是有的时候我们需要在运行的时候动态地对一个对象的指定方法进行调用,我不想写的那么死,在编译的时候就写就好像小明想和小红家庭中的哪个人聊天都没有确定我怎么能直接把小明和小红爸爸绑在一起呢,让程序在运行时候更有主动性,更能变通和迎接外来挑战。这时候我想写一个通用函数,传入一个对象,可以是小红爸爸,小红妈妈,可以是小红,把这个对象属性名,属性值,都输出反映给小明知道,小明才知道怎么更好的跟小红家庭成员交谈,在了解了他们兴趣爱好之后。

 

反射含义:可以获取正在运行的Java对象。

=======================================================================================

【JDK支持】:

JDK1.5以后引入,JDK1.4以及以前版本不支持。

=======================================================================================

【怎么用】:

实现Java反射的类
  1)Class:它表示正在运行的Java应用程序中的类和接口
  2)Field:提供有关类或接口的属性信息,以及对它的动态访问权限
  3)Constructor:提供关于类的单个构造方法的信息以及对它的访问权限
  4)Method:提供关于类或接口中某个方法信息

【重点】:其中Class类很重要。官方解释一大串,然而看后并不懂什么鬼,对程序员最好的语言就是代码

转:疯狂java

 

 public static void test01() throws ClassNotFoundException {
  Class c1 = TestReflection.class;
  Class c2 = Class.forName("com.reflection.TestReflection");
  //获取指定的包名
  String package01 = c1.getPackage().getName();
  String package02 = c2.getPackage().getName();
  System.out.println("package01 = " + package01);
  System.out.println("package02 = " + package02);
  //获取类的修饰符
  int mod = c1.getModifiers();
  String modifier = Modifier.toString(mod);
  System.out.println("modifier = " + modifier);
  //获取指定类的完全限定名
  String className = c1.getName();
  System.out.println("className = " + className);
  //获取指定类的父类
  Class superClazz = c1.getSuperclass();
  String superClazzName = superClazz.getName();
  System.out.println("superClazzName = " + superClazzName);
  //获取实现的接口
  Class[] interfaces = c1.getInterfaces();
  for (Class t : interfaces) {
  System.out.println("interfacesName = " + t.getName());
  }
  //获取指定类的成员变量
  Field[] fields = c1.getDeclaredFields();
  for (Field field : fields) {
  modifier = Modifier.toString(field.getModifiers()); //获取每个
  字段的访问修饰符
  Class type = field.getType(); //获取字段的数据类型所对应的
  Class对象
  String name = field.getName(); //获取字段名
  if (type.isArray()) { //如果是数组类型则需要特别处理
  String arrType = type.getComponentType().getName() +
  "[]";
  System.out.println("" + modifier + " " + arrType + " "
  + name + ";");
  } else {
  System.out.println("" + modifier + " " + type + " " +
  name + ";");
  }
  }
  //获取类的构造方法
  Constructor[] constructors = c1.getDeclaredConstructors();
  for (Constructor constructor : constructors) {
  String name = constructor.getName(); //构造方法名
  modifier = Modifier.toString(constructor.getModifiers()); //获取访问修饰符
  System.out.println("" + modifier +" " + name + "(");
  Class[] paramTypes = constructor.getParameterTypes(); //获取构造方法中的参数
  for (int i = 0; i < paramTypes.length; i++) {
  if (i > 0) {
  System.out.print(",");
  }
  if (paramTypes[i].isArray()) {
  System.out.println(paramTypes
  [i].getComponentType().getName()+"[]");
  } else {
  System.out.print(paramTypes[i].getName());
  }
  }
  System.out.println(");");
  }
  //获取成员方法
  Method[] methods = c1.getDeclaredMethods();
  for (Method method: methods) {
  modifier = Modifier.toString(method.getModifiers());
  Class returnType = method.getReturnType(); //获取方法的返回类型
  if (returnType.isArray()) {
  String arrType = returnType.getComponentType
  ().getName()+"[]";
  System.out.print(""+modifier+" " + arrType + " " +
  method.getName() + "(");
  } else {
  System.out.print("" + modifier + " " +
  returnType.getName() + " " + method.getName() + "(");
  }
  Class[] paramTypes = method.getParameterTypes();
  for (int i = 0; i < paramTypes.length; i++) {
  if (i > 0) {
  System.out.print(",");
  }
  if (paramTypes[i].isArray()) {
  System.out.println(paramTypes
  [i].getComponentType().getName()+"[]");
  } else {
  System.out.print(paramTypes[i].getName());
  }
  }
  System.out.println(");");
  }

 

 https://www.douban.com/note/306848299/

 

这个网址各种用法写的非常详细,大家可以去看一下。基本涵盖反射机制在代码中的方法实例