zoukankan      html  css  js  c++  java
  • 2.通过反射动态创建对象,获取属性,获取方法

    1、创建Student.java

    复制代码
     1 package com.part1;
     2 /**
     3  * 学生类
     4  * @author pc
     5  *
     6  */
     7 public class Student {
     8     private int sid;
     9     private String sname;
    10     private int password;
    11     private int age;
    12     public String sex;
    13     
    14     public Student() {
    15     }
    16     
    17     public Student(int sid, String sname, int password) {
    18         this.sid = sid;
    19         this.sname = sname;
    20         this.password = password;
    21     }
    22 
    23     public Student(int sid, String sname, int password, int age, String sex) {
    24         this.sid = sid;
    25         this.sname = sname;
    26         this.password = password;
    27         this.age = age;
    28         this.sex = sex;
    29     }
    30 
    31     public int getSid() {
    32         return sid;
    33     }
    34     public void setSid(int sid) {
    35         this.sid = sid;
    36     }
    37     public String getSname() {
    38         return sname;
    39     }
    40     public void setSname(String sname) {
    41         this.sname = sname;
    42     }
    43     public int getPassword() {
    44         return password;
    45     }
    46     public void setPassword(int password) {
    47         this.password = password;
    48     }
    49     public int getAge() {
    50         return age;
    51     }
    52     public void setAge(int age) {
    53         this.age = age;
    54     }
    55     public String getSex() {
    56         return sex;
    57     }
    58     public void setSex(String sex) {
    59         this.sex = sex;
    60     }
    61     
    62     private void eat(String food){
    63         System.out.println(food);
    64     }
    65     @Override
    66     public String toString() {
    67         return "Student [age=" + age + ", password=" + password + ", sex="
    68                 + sex + ", sid=" + sid + ", sname=" + sname + "]";
    69     }
    70     
    71     
    72 
    73 }
    复制代码

    2、创建测试类Test.java

    复制代码
      1 package com.part1;
      2 
      3 import java.lang.reflect.Constructor;
      4 import java.lang.reflect.Field;
      5 import java.lang.reflect.InvocationTargetException;
      6 import java.lang.reflect.Method;
      7 
      8 public class Test1 {
      9     public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
     10         //1.获取Class对象三种方式
     11         //1.1 getClass方法反射只能获取类信息(比较烦)
     12         Student stu=new Student();
     13         Class cla=stu.getClass();
     14         System.out.println(cla);
     15         
     16         //1.2 class方法反射获取类或接口信息 (更方便)
     17         Class cla2=Student.class;
     18         System.out.println(cla2);
     19         
     20         //1.3 forName方法根据地址反射获取类或接口信息(更精确)
     21         Class cla3=Class.forName("com.part1.Student");
     22         System.out.println(cla3);
     23         
     24         //2.动态创建对象
     25         //2.1 newInstance创建对象(无参数)
     26         Student stu2=(Student) cla2.newInstance();
     27         System.out.println(stu2);
     28         
     29         //2.2通过有参数构造创建对象
     30         //获取有参数的构造方法
     31         Constructor con=cla3.getConstructor(int.class,String.class,int.class);
     32         
     33         //根据有参数的构造方法创建对象
     34         Student stu3=(Student) con.newInstance(1,"holly",18);
     35         System.out.println(stu3);
     36         
     37         //3.获取对象的属性
     38         //3.1 获取public字段
     39         System.out.println("-----------------获取public字段----------------");
     40         //3.1.1 只能获取所有公用的属性
     41         Field[] stuFields=cla2.getFields();
     42         for (Field i : stuFields) {
     43             System.out.println(i);
     44         }
     45         //3.1.2 获取某一个公共的属性
     46         Field sexField=cla2.getField("sex");
     47         
     48         //3.1.3 给某个公共属性赋值
     49         sexField.set(stu2, "女");
     50         
     51         //3.1.4 获取某个公共属性值
     52         System.out.println(sexField.get(stu2));
     53         
     54         //3.2获取私有的字段
     55         System.out.println("-----------获取字段和访问修饰符无关----------");
     56         //3.2.1 获取所有字段和访问修饰符无关
     57         Field[] fields3=cla3.getDeclaredFields();
     58         for (Field field : fields3) {
     59             System.out.println(field);
     60         }
     61         
     62         //3.2.2 获取某个私有字段
     63         Field snameField=cla3.getDeclaredField("sname");
     64         
     65         //3.2.3 给某个私有字段解除权限,参数为true截取权限限制
     66         snameField.setAccessible(true);
     67         
     68         //3.2.4 给解除的私有字段赋值
     69         snameField.set(stu3, "王静娴");
     70         
     71         //3.2.5 获取某个字段的属性值
     72         System.out.println(snameField.get(stu3));
     73         
     74         //4.获取对象的方法
     75         System.out.println("----获取所有的公共方法----");
     76         //4.1 获取公有方法
     77         //4.1.1 获取所有的公共的方法
     78         Method[] methods =cla2.getMethods();
     79         for (Method method : methods) {
     80             System.out.println(method);
     81         }
     82         
     83         //4.1.2 获取某个公共的方法
     84         Method passwordMethod=cla2.getMethod("setPassword", int.class);
     85         
     86         //4.1.3 动态调用方法
     87         passwordMethod.invoke(stu2, 123);
     88         System.out.println(stu2);
     89         
     90         //4.2 获取方法(和访问修饰符无关)
     91         //4.2.1 获取所有的方法和访问修饰符无关
     92         Method[] methods2=cla3.getDeclaredMethods();
     93         for (Method method : methods2) {
     94             System.out.println(method);
     95         }
     96         
     97         //4.2.2 获取某个私有方法,获取的方法签名
     98         Method eatMethod=cla3.getDeclaredMethod("eat", String.class);
     99         
    100         //4.2.3 解除方法操作权限
    101         eatMethod.setAccessible(true);
    102         
    103         //4.2.4 调用某个方法
    104         eatMethod.invoke(stu3, "中午吃木桶饭");
    105     }
    106 
    107 }
    复制代码

    3、运行效果

    class com.part1.Student
    class com.part1.Student
    class com.part1.Student
    Student [age=0, password=0, sex=null, sid=0, sname=null]
    Student [age=0, password=18, sex=null, sid=1, sname=holly]
    -----------------获取public字段----------------
    public java.lang.String com.part1.Student.sex

    -----------获取字段和访问修饰符无关----------
    private int com.part1.Student.sid
    private java.lang.String com.part1.Student.sname
    private int com.part1.Student.password
    private int com.part1.Student.age
    public java.lang.String com.part1.Student.sex
    王静娴
    ----获取所有的公共方法----
    public java.lang.String com.part1.Student.toString()
    public void com.part1.Student.setPassword(int)
    public int com.part1.Student.getSid()
    public void com.part1.Student.setSid(int)
    public java.lang.String com.part1.Student.getSname()
    public void com.part1.Student.setSname(java.lang.String)
    public int com.part1.Student.getPassword()
    public int com.part1.Student.getAge()
    public void com.part1.Student.setAge(int)
    public java.lang.String com.part1.Student.getSex()
    public void com.part1.Student.setSex(java.lang.String)
    public final void java.lang.Object.wait() throws java.lang.InterruptedException
    public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
    public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
    public native int java.lang.Object.hashCode()
    public final native java.lang.Class java.lang.Object.getClass()
    public boolean java.lang.Object.equals(java.lang.Object)
    public final native void java.lang.Object.notify()
    public final native void java.lang.Object.notifyAll()
    Student [age=0, password=123, sex=女, sid=0, sname=null]
    public java.lang.String com.part1.Student.toString()
    public void com.part1.Student.setPassword(int)
    private void com.part1.Student.eat(java.lang.String)
    public int com.part1.Student.getSid()
    public void com.part1.Student.setSid(int)
    public java.lang.String com.part1.Student.getSname()
    public void com.part1.Student.setSname(java.lang.String)
    public int com.part1.Student.getPassword()
    public int com.part1.Student.getAge()
    public void com.part1.Student.setAge(int)
    public java.lang.String com.part1.Student.getSex()
    public void com.part1.Student.setSex(java.lang.String)
    中午吃木桶饭

  • 相关阅读:
    VS2013
    有了门面,程序会更加体面!- pos软件基于三层架构 -09
    无熟人难办事?- 闲聊设计模式-迪米特法则
    三层架构,分层开发
    Filezilla 错误
    归档和压缩
    在Linux系统下用dd命令制作ISO镜像U盘启动盘
    脚本语言
    node.js知识点提取
    npm cnpm
  • 原文地址:https://www.cnblogs.com/forever29/p/12765542.html
Copyright © 2011-2022 走看看