zoukankan      html  css  js  c++  java
  • Java的反射机制

    Java的反射机制

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

    JAVA反射(反射)机制:"程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言"。从这个观点看,Perl,Python,Ruby是动态语言,C++,java,C#不是动态语言。但是Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以与运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括method定义),并生成其对象实体、或对其fields设置,或唤起其methods。

    Java反射机制主要提供了一下功能:

    1. 在运行时判断任意一个对象所属的类;
    2. 在运行时构造任意一个类的对象;
    3. 在运行时判断任意一个类所具有的成员变量和方法;
    4. 在运行时调用任意一个对象的方法;
    5. 生成动态代理;

      附:反射的基本例子

      1.通过反射实例化一个对象

      package reflect.demo1;

      //通过一个对象获得完整的包名和类名

      public class TestReflect1 {

          public static void main(String[] args) throws Exception {

              Class<?> class1=null;

              Class<?> class2=null;

              Class<?> class3=null;

              class1=Class.forName("reflect.demo1.TestReflect1");

              class2=new TestReflect2().getClass();

              class3=TestReflect1.class;

              System.out.println(class1.getName());

              System.out.println(class2.getName());

              System.out.println(class3.getName());

          }

      }

      2.通过一个对象获得完整的包名和类名

      package reflect.demo1;

      //通过一个对象获得完整的包名和类名

      public class TestReflect2 {

          public static void main(String[] args) {

              TestReflect2 testReflect=new TestReflect2();

              System.out.println(testReflect.getClass().getName());

          }

      }

      3.获得一个对象的父类与实现的接口

      package reflect.demo1;

      import java.io.Serializable;

      //获得一个对象的父类与实现的接口

      public class TestReflect3 implements Serializable {

          private static final long serialVersionUID=-2862585049955236662L;

          public static void main(String[] args) throws Exception {

              Class<?> clazz=Class.forName("proxy.demo1.TestReflect");

              Class<?> parentClass=clazz.getSuperclass();

              System.out.println(parentClass.getName());

              

              Class<?> intes[]=clazz.getInterfaces();

              for(int i=0;i<intes.length;i++){

                  System.out.println(intes[i].getName());

              }

          }

      }

      4.通过反射机制实例化一个类的对象

      package reflect.demo1;

      import java.lang.reflect.Constructor;

      //通过反射机制实例化一个类的对象

      //获取某个类中的全部构造函数

      public class TestReflect4 {

          public static void main(String[] args) throws Exception {

              Class<?> class1=null;

              class1=Class.forName("reflect.demo1.User");

              //第一种方法,实例化默认构造方法,调用set赋值

              User user=(User)class1.newInstance();

              user.setAge(20);

              user.setName("Rollen");

              System.out.println(user.getAge());

              System.out.println(user.getName());

              

              //第二种方法 取得全部的构造函数 使用构造函数赋值

              Constructor<?> cons[]=class1.getConstructors();

              //查看每个构造方法需要的参数

              for(int i=0;i<cons.length;i++){

                  Class<?> clazzs[]=cons[i].getParameterTypes();

                  System.out.print("cons["+i+"] (");

                  for(int j=0;j<clazzs.length;j++){

                      if(j==clazzs.length){

                          System.out.print(clazzs[j].getName());

                      }else{

                          System.out.print(clazzs[j].getName()+",");

                      }

                  }

                  System.out.println(")");

              }

              

              user=(User) cons[1].newInstance(20,"Rollen");

              System.out.println(user);

          }

      }

      5.取得本类中的全部属性

      package reflect.demo1;

      import java.io.Serializable;

      import java.lang.reflect.Field;

      import java.lang.reflect.Modifier;

      public class TestReflect5 implements Serializable{

          private static final long serialVersionUID=-2862585049955236662L;

          public static void main(String[] args) throws Exception{

              Class<?> clazz=Class.forName("reflect.demo1.TestReflect5");

              System.out.println("========本类属性========");

              //取得本类中的全部属性

              Field[] field=clazz.getDeclaredFields();

              for(int i=0;i<field.length;i++){

                  //权限修饰符

                  int mo=field[i].getModifiers();

                  String priv=Modifier.toString(mo);

                  //属性类型

                  Class<?> type=field[i].getType();

                  System.out.println(priv);

                  System.out.println(field[i].getName());

              }

                

              

              System.out.println("========实现的接口或者父类的属性======");

              //取得实现的接口或者父类的属性

              Field[] filed1=clazz.getFields();

              for(int j=0;j<filed1.length;j++){

                  //权限修饰符

                  int mo=filed1[j].getModifiers();

                  String priv=Modifier.toString(mo);

                  //属性类型

                  Class<?> type=filed1[j].getType();

                  System.out.println(priv);

                  System.out.println(type.getName());

              }

          }

      }

      6.获取某个类的全部方法去

      package reflect.demo1;

      import java.lang.reflect.Method;

      import java.lang.reflect.Modifier;

      //获取某个类的全部方法去

      public class TestReflect6 {

           private static final long serialVersionUID = -2862585049955236662L;

           public static void main(String[] args) throws Exception {

           Class<?> clazz = Class.forName("reflect.demo1.TestReflect6");

           Method method[] = clazz.getMethods();

           for (int i = 0; i < method.length; ++i) {

           Class<?> returnType = method[i].getReturnType();

           Class<?> para[] = method[i].getParameterTypes();

           int temp = method[i].getModifiers();

           System.out.print(Modifier.toString(temp) + " ");

           System.out.print(returnType.getName() + " ");

           System.out.print(method[i].getName() + " ");

           System.out.print("(");

           for (int j = 0; j < para.length; ++j) {

           System.out.print(para[j].getName() + " " + "arg" + j);

           if (j < para.length - 1) {

           System.out.print(",");

           }

           }

           Class<?> exce[] = method[i].getExceptionTypes();

           if (exce.length > 0) {

           System.out.print(") throws ");

           for (int k = 0; k < exce.length; ++k) {

           System.out.print(exce[k].getName() + " ");

           if (k < exce.length - 1) {

           System.out.print(",");

           }

           }

           } else {

           System.out.print(")");

           }

           System.out.println();

           }

           }

      }

      7.通过反射机制调用某个类的方法

      package reflect.demo1;

      import java.lang.reflect.Method;

      //通过反射机制调用某个类的方法

      public class TestReflect7 {

          public static void main(String[] args) throws Exception{

              Class<?> clazz=Class.forName("reflect.demo1.TestReflect7");

              //调用TestReflect类中的reflect1方法

              Method method=clazz.getMethod("reflect1");

              method.invoke(clazz.newInstance());

              

              System.out.println("");

              method=clazz.getMethod("reflect2", int.class,String.class);

              method.invoke(clazz.newInstance(),20,"张三");

          }

          

          public void reflect1(){

              System.out.println("java reflect invoke method1");

          }

          

          public void reflect2(int age,String name){

              System.out.println("java reflect invoke method2");

              System.out.println("age:"+age+" "+"name:"+name);

          }

      }

      8.通过反射机制操作某个类的属性

      package reflect.demo1;

      import java.lang.reflect.Field;

      //通过反射机制操作某个类的属性

      public class TestReflect8 {

          private String proprety="kexinxin";

          public static void main(String[] args)throws Exception{

              Class<?> clazz=Class.forName("reflect.demo1.TestReflect8");

              Object obj=clazz.newInstance();

              //可以直接对private的属性赋值

              Field field=clazz.getDeclaredField("proprety");

              System.out.println(field.get(obj));

              field.setAccessible(true);

              field.set(obj, "java reflect");

              System.out.println(field.get(obj));

              

              TestReflect8 testReflect=new TestReflect8();

              System.out.println(testReflect.getClass().getClassLoader().getClass().getName());

          }

      }

      9.反射机制的应用实例

      package reflect.demo1;

      import java.lang.reflect.InvocationTargetException;

      import java.lang.reflect.Method;

      import java.util.ArrayList;

      //反射机制的应用实例,在泛型为Integer的ArrayList中存放一个String类型的对象

      public class TestReflect9 {

          public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

              ArrayList<Integer> list=new ArrayList<Integer>();

              Method method=list.getClass().getMethod("add", Object.class);

              method.invoke(list, "Java反射机制实例");

              System.out.println(list.get(0));

          }

      }

      10.通过反射取得并修改数组的信息

      package reflect.demo1;

      import java.lang.reflect.Array;

      //通过反射取得并修改数组的信息

      public class TestReflect10 {

          public static void main(String[] args) throws Exception {

      int[] temp = { 1, 2, 3, 4, 5 };

      Class<?> demo = temp.getClass().getComponentType();

      System.out.println("数组类型: " + demo.getName());

      System.out.println("数组长度 " + Array.getLength(temp));

      System.out.println("数组的第一个元素: " + Array.get(temp, 0));

      Array.set(temp, 0, 100);

      System.out.println("修改之后数组第一个元素为: " + Array.get(temp, 0));

      }

      }

      11.通过反射机制修改数组的大小

      package reflect.demo1;

      import java.lang.reflect.Array;

      //通过反射机制修改数组的大小

      public class TestReflect11 {

          public static void main(String[] args) throws Exception {

      int[] temp = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

      int[] newTemp = (int[]) arrayInc(temp, 15);

      print(newTemp);

      String[] atr = { "a", "b", "c" };

      String[] str1 = (String[]) arrayInc(atr, 8);

      print(str1);

      }

      // 修改数组大小

      public static Object arrayInc(Object obj, int len) {

      Class<?> arr = obj.getClass().getComponentType();

      Object newArr = Array.newInstance(arr, len);

      int co = Array.getLength(obj);

      System.arraycopy(obj, 0, newArr, 0, co);

      return newArr;

      }

      // 打印

      public static void print(Object obj) {

      Class<?> c = obj.getClass();

      if (!c.isArray()) {

      return;

      }

      System.out.println("数组长度为: " + Array.getLength(obj));

      for (int i = 0; i < Array.getLength(obj); i++) {

      System.out.print(Array.get(obj, i) + " ");

      }

      System.out.println();

      }

      }

  • 相关阅读:
    在VS Code中配置GO开发环境并调试
    go文件操作实践[读写zip tar xlsx文件]
    go 文件操作实践[读写json xlm gob txt]
    go inject 实践
    go的反射reflect
    go goroutine channel 和C# Task BlockingCollection 以及python该如何实现
    beego redis作为缓存
    beego Session redis存储以及是否阻塞
    Beego generate自动生成代码 以及注解路由 @router
    bee go用base64Captcha生成base64的验证码
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10049810.html
Copyright © 2011-2022 走看看