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

    一、Java反射机制的概念:

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

    二、功能:

      在程序运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

    三、API使用示例

    1. import java.lang.reflect.Constructor;  
    2. import java.lang.reflect.Field;  
    3. import java.lang.reflect.Method;  
    4. import java.lang.reflect.Modifier;  
    5.   
    6. /** 
    7.  * 反射学习笔记 
    8.  */  
    9. public class ReflectDemo {  
    10.   
    11.     public static void main(String[] args) {  
    12.         try {  
    13.             //获得Class对象的三种方式  
    14.             //方式一:  
    15.             Class class1 = int.class;   //8个基本数据类型和一个特殊类型void获取Class对象的方式  
    16.             class1 = Cat.class;  
    17.             //包装类的获取方式  
    18.             class1 = Integer.class;  
    19.             class1 = Integer.TYPE;  
    20.               
    21.             //方式二:  
    22.             //引用类型  
    23.             class1 = "abc".getClass();    
    24.             class1 = new String().getClass();  
    25.             class1 = new Cat().getClass();  
    26.               
    27.             //方式三:  
    28.             class1 = Class.forName("java.lang.String");  
    29.               
    30.             //基本类型和包装类型的Class对象  
    31.             Class<Boolean> booleanClass = boolean.class;  
    32.             Class<Boolean> booleanClass2 = Boolean.TYPE;  
    33.             //比较的是内存中的字节码文件,而非字节码文件中的内容  
    34.             System.out.println("boolean.class==Boolean.TYPE: " + (booleanClass == booleanClass2));  
    35.             Class<Byte> byteClass = byte.class;  
    36.             Class<Byte> byteClass2 = Byte.TYPE;  
    37.             System.out.println("byte.class==Byte.TYPE: " + (byteClass == byteClass2));  
    38.             Class<Character> charClass = char.class;  
    39.             Class<Character> charClass2 = Character.TYPE;  
    40.             System.out.println("char.class==Character.TYPE: " + (charClass == charClass2));  
    41.             Class<Short> shortClass = short.class;  
    42.             Class<Short> shortClass2 = Short.TYPE;  
    43.             System.out.println("short.class==Short.TYPE: " + (shortClass == shortClass2));  
    44.             Class<Integer> integerClass = Integer.TYPE;  
    45.             Class<Integer> intClass = int.class;  
    46.             System.out.println("int.class==Integer.TYPE: " + (intClass == integerClass));  
    47.             Class<Long> longClass = long.class;  
    48.             Class<Long> longClass2 = Long.TYPE;  
    49.             System.out.println("long.class==Long.TYPE: " + (longClass == longClass2));  
    50.             Class<Float> floatClass = float.class;  
    51.             Class<Float> floatClass2 = Float.TYPE;  
    52.             System.out.println("float.class==Float.TYPE: " + (floatClass == floatClass2));  
    53.             Class<Double> doubleClass = double.class;  
    54.             Class<Double> doubleClass2 = Double.TYPE;  
    55.             System.out.println("double.class==Double.TYPE: " + (doubleClass == doubleClass2));  
    56.             Class<Void> voidClass = void.class;  
    57.             Class<Void> voidClass2 = Void.TYPE;  
    58.             System.out.println("void.class==Void.TYPE: " + (voidClass == voidClass2));  
    59.             System.out.println("int[][].class == int[][].class: " + (int[][].class == int[][].class));  
    60.             //判断数据类型  
    61.             System.out.println("int.class.isPrimitive(): " + int.class.isPrimitive());  //判断是否基本数据类型  
    62.             System.out.println("Integer.class.isPrimitive(): " + Integer.class.isPrimitive());  
    63.             System.out.println("int[].class.isPrimitive(): " + int[].class.isPrimitive());  
    64.             System.out.println("int[].class.isArray(): " + int[].class.isArray());      //判断是否数组类型  
    65.               
    66.             System.out.println("---------------------------------------");  
    67.             Class<Cat> classz = Cat.class;  
    68.             // 调用无参的公共构造方法  
    69.             Constructor<Cat> constructor = classz.getConstructor(null);  
    70.             Cat cat = constructor.newInstance(null);  
    71.   
    72.             // 调用带参数的公有构造方法  
    73.             constructor = classz.getConstructor(String.class);  
    74.             cat = constructor.newInstance("汤姆猫");  
    75.             System.out.println(cat.getName());  
    76.               
    77.             //调用带参的私有构造方法  
    78.             constructor = classz.getDeclaredConstructor(String.class,String.class);  
    79.             constructor.setAccessible(true);  
    80.             cat = constructor.newInstance("不吃老鼠的猫","黄猫");  
    81.               
    82.             //获得一个属性的值(公共的)  
    83.             Field fieldName = classz.getField("name");  
    84.             System.out.println(fieldName.get(cat));  
    85.             fieldName.set(cat, "美猫猫");  
    86.             System.out.println(fieldName.get(cat));  
    87.             //私有的  
    88.             fieldName = classz.getDeclaredField("type");  
    89.             fieldName.setAccessible(true);  
    90.             fieldName.set(cat,"挪威森林猫");  
    91.             System.out.println(fieldName.get(cat));  
    92.               
    93.             //调用无参的公共方法  
    94.             Method method = classz.getMethod("catchMouse", null);  
    95.             method.invoke(cat, null);  
    96.             //调用带参的公共方法  
    97.             method = classz.getMethod("eat", String.class);  
    98.             method.invoke(cat, "鱼");  
    99.             //调用私有方法  
    100.             method = classz.getDeclaredMethod("display", null);  
    101.             method.setAccessible(true);  
    102.             method.invoke(cat, null);  
    103.               
    104.             //调用带数组参数的方法  
    105.             Class arraysClass = Class.forName("java.util.Arrays");  //加载内存中java.util.Arrays的Class字节码文件  
    106.             Method arrayMethod = arraysClass.getMethod("sort", int[].class);  
    107.             int[] nums = {3,5,9,2,6,10};  
    108.             arrayMethod.invoke(null, nums); //因为sort是java.util.Arrays类的静态方法,不需要实例对象,所以第一个参数为null  
    109.             arrayMethod = arraysClass.getMethod("toString", int[].class);  
    110.             System.out.println(arrayMethod.invoke(null, nums)); //打印排序后的数组  
    111.               
    112.             //获得父类信息  
    113.             System.out.println(classz.getSuperclass().getName());   //获得父类的名称  
    114.             Class superClass = classz.getSuperclass();  
    115.             Method[] methods = superClass.getDeclaredMethods(); //获得父类的所有方法,包括私有方法  
    116.             for (Method method2 : methods) {  
    117.                 System.out.print(method2.getName() + " ");  
    118.             }  
    119.             System.out.println();  
    120.             //判断是否抽象类,用java.lang.reflect.Modifier类可以获得一个类中成员的访问修饰符  
    121.             int modifier = superClass.getModifiers();  
    122.             System.out.println(Modifier.isAbstract(modifier));  
    123.               
    124.             //获得父类的所有属性,包括私有的  
    125.             Field[] fields = superClass.getDeclaredFields();  
    126.             for (Field field : fields) {  
    127.                 System.out.print(field + "  ");  
    128.             }  
    129.             System.out.println();  
    130.   
    131.         } catch (Exception e) {  
    132.             e.printStackTrace();  
    133.         }  
    134.     }  
    135. }  
    136.   
    137. /** 
    138.  * 动物 
    139.  */  
    140. abstract class Animal {  
    141.   
    142.     /** 
    143.      * 名称 
    144.      */  
    145.     public String name;  
    146.   
    147.     /** 
    148.      * 颜色 
    149.      */  
    150.     private String color;  
    151.   
    152.     /** 
    153.      * 年龄 
    154.      */  
    155.     private int age;  
    156.   
    157.     public int getAge() {  
    158.         return age;  
    159.     }  
    160.   
    161.     public void setAge(int age) {  
    162.         this.age = age;  
    163.     }  
    164.   
    165.     public String getName() {  
    166.         return name;  
    167.     }  
    168.   
    169.     public void setName(String name) {  
    170.         this.name = name;  
    171.     }  
    172.   
    173.     public String getColor() {  
    174.         return color;  
    175.     }  
    176.   
    177.     public void setColor(String color) {  
    178.         this.color = color;  
    179.     }  
    180.   
    181.     /** 
    182.      * 吃东西 
    183.      *  
    184.      * @param name 
    185.      */  
    186.     public abstract void eat(String name);  
    187.   
    188. }  
    189.   
    190. /** 
    191.  * 猫 
    192.  *  
    193.  */  
    194. class Cat extends Animal {  
    195.   
    196.     /** 
    197.      * 猫的种类 
    198.      */  
    199.     private String type;  
    200.   
    201.     public Cat() {  
    202.         System.out.println("Cat");  
    203.     }  
    204.       
    205.     private Cat(String name,String type) {  
    206.         this.name = name;  
    207.         this.type = type;  
    208.     }  
    209.   
    210.     public Cat(String name) {  
    211.         this.name = name;  
    212.     }  
    213.   
    214.     public String getType() {  
    215.         return type;  
    216.     }  
    217.   
    218.     public void setType(String type) {  
    219.         this.type = type;  
    220.     }  
    221.   
    222.     /** 
    223.      * 抓老鼠 
    224.      */  
    225.     public void catchMouse() {  
    226.         System.out.println("抓老鼠。。。");  
    227.     }  
    228.   
    229.     @Override  
    230.     public void eat(String foodName) {  
    231.         System.out.println("猫吃" + foodName + "。");  
    232.     }  
    233.       
    234.     /** 
    235.      * 显示猫的名称 
    236.      */  
    237.     private void display() {  
    238.         System.out.println("name:" + name);  
    239.     }  
    240.   
    241. }  
     
  • 相关阅读:
    大数据技术(1-5题)
    如何使用不同的编程语言来造一匹马
    Redis 数据类型及应用场景
    Swoole中内置Http服务器
    redis 数据库主从不一致问题解决方案
    easyswoole对接支付宝,微信支付
    PHP+Swoole 作为网络通信框架
    基于swoole实现多人聊天室
    swoole与php协程实现异步非阻塞IO开发
    swoole中使用task进程异步的处理耗时任务
  • 原文地址:https://www.cnblogs.com/starhu/p/5605335.html
Copyright © 2011-2022 走看看