• java反射机制(基础版)


      1 package com.reflect;
      2 
      3 import java.lang.reflect.Constructor;
      4 import java.lang.reflect.Field;
      5 import java.lang.reflect.Method;
      6 
      7 /**
      8  * java反射机制的基础方法
      9  * @author dr
     10  *
     11  */
     12 public class ReflectTest {
     13     public static void main(String[] args) throws Exception {
     14     //每个类被加载之后 系统都会为其生成一个Class对象,通过该Class对象可以访问该类的xinxi
     15     //1、获取Class对象(三种方式)
     16         // 1> Class.forName();
     17         Class p1 =  Class.forName("com.reflect.Person");
     18         // 2>类.class属性获取Class对象
     19         Class p2 = Person.class;
     20         // 3>对象的getClass()方法获取Class对象
     21         Person person = new Person();
     22         Class p3 = person.getClass();
     23     //2、创建对象
     24         // 1>Class对象的newInstance()方法 创建对象 使用默认的构造器构造实例
     25         Person p = (Person) p1.newInstance();
     26         // 2>使用Class对象获取指定的构造器 在用构造器对象的newInstance()的方法创建对象
     27         Constructor<Person> actor =  p2.getConstructor(String.class,String.class);
     28         p = actor.newInstance("bai","123");
     29         System.out.println(p.getName());
     30     //3、用Class对象获取信息
     31         // 1>获取构造函数 返回所有的构造函数 与访问级别没有关系
     32             Constructor<Person>[] actors = p2.getDeclaredConstructors();
     33             for(Constructor<Person> a:actors){
     34                 System.out.println(a.getName());
     35             }
     36         // 2>获取构造函数 返回所有的构造函数 只获取public 的构造函数
     37             Constructor<Person>[] acts = p2.getConstructors();
     38             for(Constructor<Person> a:acts){
     39                 System.out.println(a.getName());
     40             }
     41         // 3>返回指定参数的构造函数 
     42             //(使用getConstructor()只能获取取到public类型的构造函数,此时报错:java.lang.NoSuchMethodException)
     43             //Constructor<Person> single = p2.getConstructor(String.class);
     44             //(使用getConstructor()只能获取取到public类型的构造函数,此时报错:
     45             //ReflectTest can not access a member of class com.reflect.Person with modifiers "private")
     46             //这个时候设置可以访问私有属性或方法的权限即可
     47             Constructor<Person> single = p2.getDeclaredConstructor(String.class);
     48             single.setAccessible(true);
     49             Person pp = single.newInstance("name");
     50             System.out.println(pp.getName());
     51         // 4> 获取和调用方法 (获取所有的方法 以及所有共有的方法 指定的方法 为私有方法设置访问权限等 与construct类似)
     52             Method method = p2.getMethod("getName",null);
     53             System.out.println(method.invoke(p, null));
     54             //设置方法名称 和 该方法所需参数的类型的Class
     55             Method m = p2.getDeclaredMethod("setName", String.class);
     56             //调用的使用要指定哪个对象调用的 和传入的参数
     57             m.invoke(p, "baichuanyu");
     58             System.out.println(p.getName());
     59         // 5> 访问属性值
     60             //name属性是私有属性
     61             Field field = p2.getDeclaredField("name");
     62             //报错:Class ReflectTest can not access Person with modifiers "private"
     63             //field.set(p, "field");
     64             //为Person对象 p 的私有属性name赋值 field
     65             field.setAccessible(true);
     66             field.set(p, "field");
     67             System.out.println(p.getName());
     68     }
     69 }
     70 
     71 class Person{
     72     private String name;
     73     private String age;
     74     
     75     public Person(){
     76         
     77     }
     78     
     79     private Person(String name){
     80         this.name = name;
     81     }
     82     
     83     public Person(String name, String age) {
     84         super();
     85         this.name = name;
     86         this.age = age;
     87     }
     88     public String getName() {
     89         return name;
     90     }
     91     public void setName(String name) {
     92         this.name = name;
     93     }
     94     public String getAge() {
     95         return age;
     96     }
     97     public void setAge(String age) {
     98         this.age = age;
     99     }
    100     
    101 }
  • 相关阅读:
    javaScript设计模式探究【1】
    Java基础算法集50题
    DataTable学习笔记排序细则、列隐藏[3]
    javaScript设计模式探究【4】工厂模式
    javaScript设计模式探究【3】
    一次面试感想+js最近学习体会
    DataTable学习笔记范例应用篇[2]
    腾讯2013实习生招聘面经
    初品cakephp
    php编译中配置libxml2的错误
  • 原文地址:https://www.cnblogs.com/Wen-yu-jing/p/3534219.html
Copyright © 2020-2023  润新知