类的内省及反射

来源:互联网 发布:广告牌生成器软件 编辑:程序博客网 时间:2024/06/10 02:31

操作类(Person):
package cn.ouyang.test.entity;


public class Person {
 
 private String name;
 private int 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;
 }
 public void run(){
  System.out.println(name+"正在Running!");
 }
}
使用反射和内省操作:
package cn.ouyang.test.test;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.MethodDescriptor;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.junit.Test;

public class Test1 {
 // JAVA中的内省
 @Test
 public void test() throws Exception {
  Object obj =Class.forName("cn.ouyang.test.entity.Person")
    .newInstance();
  BeanInfo bf =Introspector.getBeanInfo(obj.getClass(), Object.class);
  PropertyDescriptor[] pds =bf.getPropertyDescriptors();
  for (PropertyDescriptor pd :pds) {
   System.out.println("属性"+ pd.getName());
   if(pd.getName().equals("name")) {
    pd.getWriteMethod().invoke(obj,"小明");
   }
  }
  MethodDescriptor[] mds =bf.getMethodDescriptors();
  for (MethodDescriptor md : mds){
   System.out.println("方法"+ md.getName());
   Method method= md.getMethod();
   if(method.getName().equals("run")) {
    method.invoke(obj,null);
   }
  }
 }

 // JAVA中的反射
 @Test
 public void test1() throws Exception {
  Class clazz =Class.forName("cn.ouyang.test.entity.Person");
  Object obj =clazz.newInstance();
  System.out.println("所有方法");
  Method[] mds =clazz.getDeclaredMethods();
  for (Method method : mds){
   System.out.println(method.getName());
  }
  System.out.println("所有属性");
  Field[] filds =clazz.getDeclaredFields();
  for (Field field : filds) {

   System.out.println(field.getName());
  }
  System.out.println("构造函数");
  Constructor[] cs=clazz.getConstructors();
  for (Constructor constructor :cs) {
   System.out.println(constructor.getName());
  }
  System.out.println(clazz.getConstructor(null));//单个
  System.out.println("super类");
  System.out.println(clazz.getSuperclass());
 }
 //反射方法
 @Test
 public void test3() throws Exception{
  Class clazz =Class.forName("cn.ouyang.test.entity.Person");
  Object obj =clazz.newInstance();
  System.out.println(obj);
  ConstructorduixiangObject=clazz.getConstructor(newClass[]{String.class,int.class});
  Objectnobj=duixiangObject.newInstance(new Object[]{"ddd",22});
  Fieldfield=clazz.getDeclaredField("name");
  field.setAccessible(true);//暴力反射(获得权限)
  System.out.println(field);
  //设置值
  field.set(nobj, "dddd");
  System.out.println(field.get(nobj));
  //得到方法
  Methodmethod=clazz.getMethod("run", new Class[]{});
  System.out.println(method.getReturnType());
  method.invoke(nobj,null);
  //得到静态方法
  MethodstMethod=clazz.getMethod("running", null);
  stMethod.invoke(null,null);
 }
 //动态创建数组1
 @Test
 public void test4() throws Exception{
  Classclazz=Class.forName("java.lang.Integer");
  Objectarr=Array.newInstance(clazz,10);
  Array.set(arr, 5, 12);
  System.out.println(Array.get(arr,5));
 }
 //动态创建数组2(三维数组)
 @Test
 public void test5() throws Exception{
  Classclazz=Class.forName("java.lang.Integer");
  int[] myshuzu={20,22,32};
  Objectarr=Array.newInstance(clazz,myshuzu);
  Object arr1=Array.get(arr,1);
  System.out.println(arr1);//x
  Object arr2=Array.get(arr1,2);
  System.out.println(arr2);//y
  Array.set(arr2, 3, 88);
  System.out.println(Array.get(arr2,3));//z
 }
}

0 0
原创粉丝点击