• Java反射学习-3


     1 package cn.tx.reflect;
     2 
     3 import java.lang.reflect.Constructor;
     4 import java.lang.reflect.Field;
     5 import java.lang.reflect.Method;
     6 import java.util.Arrays;
     7 /**
     8  * 三 、Class类中要掌握的方法:
     9  * 反射获取具体属性、方法、构造器
    10  * @author Administrator
    11  *
    12  */
    13 public class ReflectLearn3 {
    14     
    15     public static void main(String[] args) throws Exception {
    16         
    17         Class<?> clazz = Class.forName("cn.tx.reflect.Person");
    18         //1.反射获取类的属性值
    19         Field field = clazz.getDeclaredField("address");
    20         System.out.println("反射获取到的类的属性信息为:" + field);
    21         //打印结果: 反射获取到的类的属性信息为:private java.lang.String cn.tx.Person.address
    22         //设置属性:首先获取对象
    23         
    24         //2.反射获取方法:必须指定要获取的方法名和该方法的返回值类型,只靠方法名是不行的,还需要知道方法参数列表中的参数类型
    25         /*Method java.lang.Class.getDeclaredMethod(String name, Class<?>... parameterTypes) 
    26          *Class<?>... 是可变参数,表示一个元素个数不确定的Class数组 */
    27         //Person类的getName()方法,没有形参,Class数组写new Class[]{}
    28         Method method = clazz.getDeclaredMethod("getName", new Class[]{});
    29         System.out.println("获取到的getName()方法:"+method);//获取到的getName()方法:public java.lang.String cn.tx.Person.getName()
    30         Method method2 = clazz.getDeclaredMethod("setName", new Class[]{String.class}); //setName方法有一个String类型的形参
    31         System.out.println("获取到的setName()方法:"+method2);//获取到的getName()方法:public java.lang.String cn.tx.Person.getName()
    32         
    33         //3.反射获取无参构造器Constructor<?> java.lang.Class.getDeclaredConstructor(Class<?>... parameterTypes) 
    34         Constructor<?> constructor = clazz.getDeclaredConstructor(new Class[]{}); //参数为类的类对象数组
    35         System.out.println(constructor); //打印public cn.tx.Person()
    36         Constructor<?> constructor2 = clazz.getDeclaredConstructor(new Class[]{Integer.class,String.class,String.class});
    37         System.out.println(constructor2); //public cn.tx.Person(java.lang.Integer,java.lang.String,java.lang.String)
    38         
    39         //4.使用构造器创建对象: Constructor类的public T newInstance(Object ... initargs)
    40         Object object = constructor.newInstance(new Object[]{});
    41         System.out.println(object); //Person [address=null, id=null, name=null]
    42 //        Object object2 = constructor.newInstance(new Object[]{1,"李四","北京"});
    43         Object object2 = constructor2.newInstance(1,"李四","北京"); 
    44         System.out.println(object2);//Person [address=北京, id=1, name=李四]
    45         
    46         //5.设置属性
    47         //获得类的所有方法
    48         Method[] methods = clazz.getDeclaredMethods();
    49         for (Method m : methods) {
    50             //获得方法的名字;
    51             String name = m.getName(); // 在这一行打断点,F6单步调试,查看反射掉调用过程
    52             if(name.startsWith("set")){
    53                 //获得set字符串后面的值
    54                 String fieldName = name.substring(3);
    55                 //获得属性名
    56                 fieldName = fieldName.substring(0,1).toLowerCase()+ fieldName.substring(1);
    57                 //获得方法对应的属性
    58                 Field field2 = clazz.getDeclaredField(fieldName);//注意,不是getField()
    59                 //获得属性对应的具体类型
    60                 Class<?> type = field2.getType();
    61                 if(type == Integer.class){
    62                     //通过method对象反射调用Person类的方法,第一个参数是调用方法的对象,第二个参数是方法的实参值
    63                     m.invoke(object2, 2); //相当于person.setId(2)
    64                 }
    65                 if(type == String.class && "address".equals(fieldName)){
    66                     m.invoke(object2, "南京");
    67                 }
    68                 if(type == String.class && "name".equals(fieldName)){
    69                     m.invoke(object2, "tom");
    70                 }
    71             }
    72         }
    73         
    74         //6.直接设置属性:field.setAccessible(true)
    75         Field field2 = clazz.getDeclaredField("name");
    76         field2.setAccessible(true);//让私有的属性可以被访问
    77         field2.set(object2, "marry");
    78         System.out.println(object2);
    79             
    80     }
    81 }

    结果如下:

  • 相关阅读:
    googleMap JsAPI
    格式化Json代码
    baidu map JSAPI
    ajaxFileUpload与KindEditor
    Intent 意图
    初识Android
    Android环境搭建
    Android入门知识梳理
    网页版计算器
    使用socket实现简单的聊天功能
  • 原文地址:https://www.cnblogs.com/enjoyjava/p/9135556.html
Copyright © 2020-2023  润新知