zoukankan      html  css  js  c++  java
  • java19(反射)

    反射

            终极手段。规则破坏者

            1.calss

                     定义类关键字

            2. Construtor

                     构造函数的描述符

                     Class clazz = Person.class;

                     Constructor ctor = clazz.getConstructor(...);

                     ctor.setAccessible(true);

                     ctor.newInstance(...);

            3. field

                     字段(成员变量)描述符

                    Field f = clazz.getDeclaredField("name");

            4. method

                    方法描述符

                    静态方法也可以通过反射访问

         Method m = clazz.getDeclearMethod("run");

         m.invoke(null);

            5. Modifier

                    修饰符,判断是否含有指定的修饰符

                    Modifier.isStatic(m.getModifier());

    // Person.java

     1 package com.hzg.reflect;
     2 
     3 public class Person {
     4     private String name;
     5     private int age;
     6     public Person() {
     7         System.out.println("new Person()");
     8     }
     9     public Person(String name) {
    10         this.name = name;
    11         System.out.println("new Person(String name)");
    12     }
    13     public String getName() {
    14         return name;
    15     }
    16     public void setName(String name) {
    17         System.out.println("setName("+name+")");
    18         this.name = name;
    19     }
    20     public int getAge() {
    21         return age;
    22     }
    23     public void setAge(int age) {
    24         this.age = age;
    25     }
    26     public void sayHello() {
    27         System.out.println("hello");
    28     }
    29 }

    TestPerson.java

      1 package com.hzg.reflect.test;
      2 
      3 import java.io.File;
      4 import java.lang.reflect.Constructor;
      5 import java.lang.reflect.Field;
      6 import java.lang.reflect.Method;
      7 import java.lang.reflect.Modifier;
      8 import java.net.URL;
      9 
     10 import org.junit.Test;
     11 
     12 import com.hzg.reflect.Person;
     13 
     14 public class TestPerson {
     15     
     16     /**
     17      * 创建对象
     18      */
     19     @Test
     20     public void newObject() {
     21 /*        Person p = new Person();
     22         p.setName("tom");
     23         p.setAge(20);
     24         p.sayHello();*/
     25     }
     26     
     27     /**
     28      * 通过反射创建对象
     29      */
     30     @Test
     31     public void newObjectInReflect() throws Exception{
     32         Class<Person> clazz = Person.class;
     33         // getName()是类的完整类名
     34         //String name = clazz.getName();
     35         String sname = clazz.getSimpleName();
     36         System.out.println(sname);
     37         Person person = clazz.newInstance();
     38         System.out.println(person);
     39     }
     40     
     41     @Test
     42     public void testConstructor() throws Exception{
     43         Class<Person> clazz = Person.class;
     44         // 得到类的构造函数
     45         Constructor<Person> ctor = clazz.getDeclaredConstructor();
     46         ctor.setAccessible(true);
     47         Object obj = ctor.newInstance();
     48         System.out.println(obj);
     49     }
     50     
     51     @Test
     52     public void testConstructor2() throws Exception{
     53         Class<Person> clazz = Person.class;
     54         // 得到类的构造函数
     55         Constructor<Person> ctor = clazz.getDeclaredConstructor(String.class);
     56         Object obj = ctor.newInstance("jerry");
     57         System.out.println(obj);
     58     }
     59     
     60     @Test
     61     public void testMethod() throws Exception{
     62         Class<Person> clazz = Person.class;
     63         
     64         Object obj = clazz.newInstance();
     65         Method m = clazz.getMethod("setName", String.class);
     66         // p.setName("tomas");
     67         m.invoke(obj, "tomas");
     68         System.out.println("over");
     69         System.out.println(obj);
     70     }
     71     
     72     @Test
     73     public void getMethods() throws Exception {
     74         Class<Person> clazz = Person.class;
     75         //Method[] methods = clazz.getDeclaredMethods();//类中声明的方法
     76         Method[] methods = clazz.getMethods();//获得类的公有方法
     77         for (Method m: methods) {
     78             String name = m.getName();
     79             System.out.println(name);
     80             //System.out.println(m);
     81         }
     82     }
     83     
     84     /**
     85      * 字段描述符
     86      */
     87     @Test
     88     public void testField() throws Exception {
     89         Class<Person> clazz = Person.class;
     90         Person obj = clazz.newInstance();
     91         
     92         // 获得字段描述符
     93         Field f = clazz.getDeclaredField("name");
     94         
     95         // 设置可访问性
     96         f.setAccessible(true);
     97         
     98         // 设置字段值 === this.name = "tom";
     99         f.set(obj, "tom");
    100         
    101         // 取出字段值
    102         Object object = f.get(obj);
    103         
    104         System.out.println(object);
    105         
    106         System.out.println(obj.getName());
    107         
    108     }
    109     
    110     /**
    111      * Modifier:修饰符
    112      * @throws IllegalAccessException 
    113      * @throws InstantiationException 
    114      */
    115     @Test
    116     public void testModifer() throws Exception {
    117         Class<Person> clazz = Person.class;
    118         Method m = clazz.getDeclaredMethod("setName", String.class);
    119         // 得到方法的修饰符总和
    120         int modifer = m.getModifiers();
    121         System.out.println(Modifier.isPublic(modifer));
    122     }
    123     
    124     /**
    125      * 得到指定包下的所有类
    126      * @throws Exception 
    127      */
    128     @Test
    129     public void getclasses() throws Exception {
    130         Class clazz = Person.class;
    131         ClassLoader loader = clazz.getClassLoader();
    132         // 统一资源定位符
    133         URL url = loader.getResource("com/hzg/reflect");
    134         
    135         // 文件夹
    136         File file = new File(url.toURI());
    137         File[] files = file.listFiles();
    138         for (File f : files) {
    139             String fname = f.getName();
    140             if (!fname.endsWith(".class")) {
    141                 continue;
    142             }
    143             String className = fname.substring(0, fname.lastIndexOf("."));
    144             className = "com.hzg.reflect." + className;
    145             clazz = Class.forName(className);
    146             System.out.println(clazz);
    147         }
    148         
    149     }
    150     
    151     /**
    152      * 属性复制
    153      * @throws IllegalAccessException 
    154      * @throws IllegalArgumentException 
    155      */
    156     @Test
    157     public void testPropertyCopy() throws Exception {
    158         // 源对象
    159         Person src = new Person();
    160         src.setName("tom");
    161         src.setAge(20);
    162         
    163         // 目标对象
    164         Person target = new Person();
    165         
    166         Class clazz = Person.class;
    167         Field[] fs = clazz.getDeclaredFields();
    168         for (Field f : fs) {
    169             String fname = f.getName();
    170             // 判断是否可以访问,设置可访问性
    171             if (!f.isAccessible()) {
    172                 f.setAccessible(true);
    173             }
    174             // 获得该字段在src对象上对应的值
    175             Object fvalue = f.get(src);
    176             f.set(target, fvalue);
    177         }
    178         System.out.println("over");
    179         
    180     }
    181 }

     内省

            专业操作javabean

    对象复制

    // Animal.java

     1 package com.hzg.reflect;
     2 
     3 public abstract class Animal {
     4     private String name;
     5 
     6     public String getName() {
     7         return name;
     8     }
     9 
    10     public void setName(String name) {
    11         this.name = name;
    12     }
    13     
    14 }

    // Dog.java

     1 package com.hzg.reflect;
     2 
     3 public class Dog extends Animal{
     4 
     5     private String blood;
     6 
     7     public String getBlood() {
     8         return blood;
     9     }
    10 
    11     public void setBlood(String blood) {
    12         this.blood = blood;
    13     }
    14     
    15 }

    // TestPerson2.java

     1 package com.hzg.reflect.test;
     2 
     3 import java.io.File;
     4 import java.lang.reflect.Constructor;
     5 import java.lang.reflect.Field;
     6 import java.lang.reflect.Method;
     7 import java.lang.reflect.Modifier;
     8 import java.net.URL;
     9 
    10 import org.junit.Test;
    11 
    12 import com.hzg.reflect.Dog;
    13 import com.hzg.reflect.Person;
    14 
    15 public class TestPerson2 {
    16 
    17     /**
    18      * 属性复制
    19      * 
    20      * @throws IllegalAccessException
    21      * @throws IllegalArgumentException
    22      */
    23     @Test
    24     public void testPropertyCopy2() throws Exception {
    25         // 源对象
    26         Dog src = new Dog();
    27         src.setName("tom");
    28         src.setBlood("A");
    29 
    30         // 目标对象
    31         Dog target = new Dog();
    32 
    33         Class clazz = Dog.class;
    34         Field[] fs = clazz.getDeclaredFields();
    35         for (Field f : fs) {
    36             String fname = f.getName();
    37             Class<?> type = f.getType();
    38             System.out.println(type);
    39             // 判断是否可以访问,设置可访问性
    40             if (!f.isAccessible()) {
    41                 f.setAccessible(true);
    42             }
    43             // 获得该字段在src对象上对应的值
    44             Object fvalue = f.get(src);
    45             f.set(target, fvalue);
    46         }
    47         System.out.println("over");
    48 
    49     }
    50 
    51     /**
    52      * 得到整个类家族树定义的所有字段
    53      */
    54     @Test
    55     public void getAllFields() {
    56         Class clazz = Dog.class;
    57         printFields(clazz);
    58     }
    59 
    60     /**
    61      * 打印字段
    62      */
    63     private void printFields(Class clazz) {
    64         /*if (clazz == Object.class) {
    65             return;
    66         }*/
    67         if (clazz == null) {
    68             return;
    69         }
    70         Field[] fs = clazz.getDeclaredFields();
    71         if (fs != null && fs.length > 0) {
    72             for (Field f : fs) {
    73                 Class ftype = f.getType();
    74                 String fname = f.getName();
    75                 System.out.println(ftype + " " + fname);
    76             }
    77         }
    78 
    79         clazz = clazz.getSuperclass();
    80         printFields(clazz);
    81         
    82         
    83     }
    84 }

    // TestIntrospector.java

     1 package com.hzg.reflect.test;
     2 
     3 import java.beans.BeanInfo;
     4 import java.beans.Introspector;
     5 import java.beans.PropertyDescriptor;
     6 import java.lang.reflect.Method;
     7 
     8 import org.junit.Test;
     9 
    10 import com.hzg.reflect.Dog;
    11 
    12 /**
    13  * 内省,专业操作javabean
    14  * @author zhengguohuang
    15  *
    16  */
    17 public class TestIntrospector {
    18     /**
    19      * 
    20      * @throws Exception
    21      */
    22     @Test
    23     public void testIntrospective() throws Exception{
    24         // 得到bean信息
    25         BeanInfo bi = Introspector.getBeanInfo(Dog.class);
    26         PropertyDescriptor[] pds = bi.getPropertyDescriptors();
    27         for (PropertyDescriptor pd : pds) {
    28             // getXxx()
    29             Method getter = pd.getReadMethod();
    30             System.out.println(getter);
    31             // setXxx()
    32             Method setter = pd.getWriteMethod();
    33             System.out.println(setter);
    34             //getter.invoke(, args)
    35             //System.out.println(pd.getName());
    36         }
    37     }
    38 }

    使用内省实现对象的属性复制

     1 package com.hzg.reflect.test;
     2 
     3 import java.io.File;
     4 import java.io.FileOutputStream;
     5 import java.io.InputStream;
     6 import java.net.URISyntaxException;
     7 import java.net.URL;
     8 
     9 import org.junit.Test;
    10 
    11 /**
    12  * 测试类加载器
    13  * 
    14  * @author zhengguohuang
    15  *
    16  */
    17 public class TestClassLoader {
    18 
    19     /**
    20      * 获得资源url
    21      * @throws Exception 
    22      * 
    23      */
    24     @Test
    25     public void testClassLoader1() throws Exception {
    26         ClassLoader loader = ClassLoader.getSystemClassLoader();
    27         // 搜索类路径获取资源
    28         URL url = loader.getResource("com/hzg/reflect/background.jpg");
    29         File file = new File(url.toURI());
    30         System.out.println(file.length());
    31         System.out.println(loader);
    32     }
    33     
    34     /**
    35      * 获得资源流
    36      * @throws Exception 
    37      * 
    38      */
    39     @Test
    40     public void testResourceStream() throws Exception {
    41         ClassLoader loader = ClassLoader.getSystemClassLoader();
    42         // 搜索类路径获取资源
    43         InputStream is = loader.getResourceAsStream("com/hzg/reflect/background.jpg");
    44         
    45         byte[] bytes = new byte[is.available()];
    46         is.read();
    47         is.close();
    48         new FileOutputStream("d:/xxx.jpg").write(bytes);
    49         System.out.println(loader);
    50     }
    51 
    52     /**
    53      * 获得系统资源
    54      * @throws Exception 
    55      * 
    56      */
    57     @Test
    58     public void testSystemResource() throws Exception {
    59         InputStream is = ClassLoader.getSystemResourceAsStream("java/lang/String.class");
    60         System.out.println(is.available());
    61     }
    62     
    63     /**
    64      * @throws Exception
    65      * 
    66      */
    67     @Test
    68     public void testLuncher() throws Exception {
    69         // have not access
    70         // sun.misc.Launcher l = new sun.misc.Launcher();
    71         Class clazz = Class.forName("sun.misc.Launcher");
    72         Object object = clazz.newInstance();
    73         System.out.println(object);// sun.misc.Launcher@4459eb14
    74         
    75     }
    76 }

    动态代理

            不改变源码,增加新的功能

    // Person.java

     1 package com.hzg.reflect;
     2 
     3 public class Person {
     4     private String name;
     5     private int age;
     6     public Person() {
     7         System.out.println("new Person()");
     8     }
     9     public Person(String name) {
    10         this.name = name;
    11         System.out.println("new Person(String name)");
    12     }
    13     public String getName() {
    14         return name;
    15     }
    16     public void setName(String name) {
    17         System.out.println("setName("+name+")");
    18         this.name = name;
    19     }
    20     public int getAge() {
    21         return age;
    22     }
    23     public void setAge(int age) {
    24         this.age = age;
    25     }
    26     public void sayHello() {
    27         System.out.println("hello");
    28     }
    29 }

    // PersonDao.java

     1 package com.hzg.reflect.proxy;
     2 
     3 import com.hzg.reflect.Person;
     4 
     5 /**
     6  * Dao:data access object
     7  * @author zhengguohuang
     8  *
     9  */
    10 public interface PersonDao {
    11 
    12     public void insert(Person p);
    13     
    14     public void update(Person p);
    15 }

    // PersonDao2.java

     1 package com.hzg.reflect.proxy;
     2 
     3 import com.hzg.reflect.Person;
     4 
     5 /**
     6  * Dao:data access object
     7  * @author zhengguohuang
     8  *
     9  */
    10 public interface PersonDao2 {
    11 
    12     public void insert2(Person p);
    13     
    14     public void update2(Person p);
    15 }

    // PersonDaoImpl.java

     1 package com.hzg.reflect.proxy;
     2 
     3 import com.hzg.reflect.Person;
     4 
     5 /**
     6  * Dao实现类
     7  * @author zhengguohuang
     8  *
     9  */
    10 public class PersonDaoImpl implements PersonDao, PersonDao2{
    11 
    12     @Override
    13     public void insert(Person p) {
    14         System.out.println("insert");
    15     }
    16 
    17     @Override
    18     public void update(Person p) {
    19         System.out.println("update");
    20     }
    21 
    22     @Override
    23     public void insert2(Person p) {
    24         System.out.println("insert2");
    25     }
    26 
    27     @Override
    28     public void update2(Person p) {
    29         System.out.println("update2");
    30     }
    31 
    32 }

    // MyInvovationHandler.java

     1 package com.hzg.reflect.proxy;
     2 
     3 import java.lang.reflect.InvocationHandler;
     4 import java.lang.reflect.Method;
     5 
     6 public class MyInvocationHandler implements InvocationHandler {
     7 
     8     private Object target;
     9     
    10     public MyInvocationHandler(Object target) {
    11         this.target = target;
    12     }
    13 
    14     @Override
    15     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    16         System.out.println("hello");// 调用方法之前
    17         Object ret = method.invoke(target, args);
    18         System.out.println("over");// To do ... after invoke
    19         return ret;
    20     }
    21 
    22 }

    // App.java

     1 package com.hzg.reflect.proxy;
     2 
     3 import java.lang.reflect.Proxy;
     4 
     5 import com.hzg.reflect.Person;
     6 
     7 public class App {
     8 
     9     public static void main(String[] args) {
    10         ClassLoader loader = ClassLoader.getSystemClassLoader();
    11         Class[] interfaces = {PersonDao.class, PersonDao2.class};
    12         PersonDao dao = new PersonDaoImpl();
    13         MyInvocationHandler h = new MyInvocationHandler(dao);
    14         
    15         Object proxy = (PersonDao)Proxy.newProxyInstance(loader, interfaces, h);
    16         ((PersonDao)proxy).insert(new Person());
    17         ((PersonDao)proxy).update(null);
    18         ((PersonDao2)proxy).insert2(null);
    19         ((PersonDao2)proxy).update2(null);
    20     }
    21 
    22 }
  • 相关阅读:
    读《高效能人士的七个习惯》有感
    Springboot中的日志
    fastjson JSON.toJavaObject() 实体类首字母大写属性无法解析问题
    java多线程编程实例
    IDEA插件配置推荐
    Spring Boot 自定义数据源 DruidDataSource
    zookeeper环境搭建
    eureka注册中心的使用
    记事本编码
    Chrome浏览器基本操作
  • 原文地址:https://www.cnblogs.com/8386blogs/p/7668435.html
Copyright © 2011-2022 走看看