码迷,mamicode.com
首页 > Windows程序 > 详细

反射API

时间:2018-11-22 02:38:34      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:.class   封装   const   tag   ffffff   array类   methods   err   classType   

Java.lang.reflect库

  Field类:代表类的成员变量(成员变量也称为类的属性)

  Method类:代表类的方法

  Constructor类:代表类的 构造方法

  Array类:提供了动态数组,以及访问数组的元素的静态方法

通过反射实例化对象

实例化无参构造函数的对象

  Class.newInstance()

  Class.getConstructor(new Class[]{}).newInstance(new Object[]{})

实例化带参构造函数的对象

  clazz..getConstructor(Class<?>...parameterTypes).newInstance( Object...initargs)

通过反射获取并调用方法

   获取当前类以及超类的public Method

  Method[] arrMethods=classType.getMethods();

   获取当前类申明的所有 Method

         Method[] arrMethods=classType.getDeclaredMethods();

   获取当前类以及超类指定的public Method

    Method  methods=classType.getMethods(String name,Class<?>...parameterTypes);

   获取当前类申明的指定的Method

  Method  method=classType.getDeclaredMethods(String name,Class<?>...parameterTypes);

  通过反射动态运行指定的 Method

  Object obj=method.invoke(Object obj,Object...args);

 

通过反射获取并调用属性

   获取当前类以及超类的public Field

   Field[] arr Fields=classType.get Fields();

  获取当前类申明的所有 Field

        Field[] arrFields=classType.getDeclaredFields();

  获取当前类以及超类指定的public  Field

    Field   field=classType.getField(String name);

   获取当前类申明的指定的Field

    Field   field=classType.getDeclaredField(String name);

  通过反射动态设定Field值

  field.set(Object obj,Object value);

  通过反射动态获取Field值

  Object obj=field.get(Object obj);

package com.iotek.classtype;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectionDemo {
  public static void main(String[] args) throws Exception {
      //获取PerSon类所关联的class对象
      Class<?>class1=Class.forName("com.iotek.classtype.PerSon");
     /* //通过反射机制来构造一个PerSon的实例对象(会默认调用无参数的构造方法)
      PerSon perSon=(PerSon)class1.newInstance();*/
      
      //调用指定的构造方法来构造对象(会调用无参数的构造方法)
      /*Constructor<?> perSon2=class1.getConstructor(new Class[] {});
      PerSon perSon=(PerSon) perSon2.newInstance(new Object[] {});
      System.out.println(perSon);*/
      
      //调用指定的构造方法来构造对象(带参数的构造方法)
      Constructor<?> perSon2=class1.getConstructor(new Class[] {String.class,int.class});
      PerSon perSon=(PerSon) perSon2.newInstance(new Object[] {"张三",20});
      System.out.println(perSon);
      
      //获取class对象所指定的所有方法,包括私有的
      Method[] methods=class1.getDeclaredMethods();
      for (Method method : methods) {
        System.out.println(method.getName());
    }
      
      
      /*//获取class对象所指定的方法,包括私有的(method.setAccessible(true)),破坏面向对象的封装性
      Method method=class1.getDeclaredMethod("toString",new Class[] {});
      System.out.println(method);
      
      //方法的调用
     String string= (String) method.invoke(perSon, new Object[] {});
    System.out.println(string);*/
      
      //获取class对象所指定属性,包括私有的
      Field field=class1.getDeclaredField("name");
      field.setAccessible(true);
      field.set(perSon, "tantanll");
      System.out.println(field.get(perSon));
      
      
}
}

 class PerSon{
    private String name;
    private int age;
    
    
    public PerSon() {
        
    }
    public PerSon(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "PerSon [name=" + name + ", age=" + age + "]";
    }
    
}

 

反射API

标签:.class   封装   const   tag   ffffff   array类   methods   err   classType   

原文地址:https://www.cnblogs.com/tanlei-sxs/p/9998601.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!