反射,类,构造方法,方法,属性

//要进行反射的类

public class Penson {

 public int age=0;  

public String name="zhangsan";

 private String job="";  

public Penson(int age, String nameString) {

 this.age = age;
  this.name = nameString;
 }
 public Penson() {
 }
 private Penson(int age) {
  System.out.println("我是一个私有构造方法");
 }
 public void say() {
  System.out.println("您好 !我是一个公共方法");
 }
 
 private void says() {
  System.out.println("您好,我是个私有方法");
 }
 
 public void say(String name,int age) {
  System.out.println("您好 !我是:"+name+",年龄:"+age);
 }
 
 public static void sayStatic() {
  System.out.println("我是一个静态 方法");
 }
 
 public int sayReturn() {
  return 1;
 }
}

//反射

import java.lang.reflect.*;

public class Test {

 public static void main(String[] args) {  

 //setAndGetField();   

//getMethod();   

getConstructor();

getType(new Penson());

 }

/**
  * 反射类,实例化
  */
 public static void getType(Object o) {
  
   try {
   Class clazz= Class.forName("Penson");
   //第一种方式:直接创建实例
   //Penson p=(Penson) clazz.newInstance();
   //第二种:通过构造方法创建实例
//   Constructor c=clazz.getConstructor(null);//获取无参数的构造方法
//   Penson p= (Penson) c.newInstance(null);//为参数赋值
   //第三种:传参数object接收后,通过object创建实例
   Penson p= (Penson) o.getClass().newInstance();
   System.out.println(p);
   
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

/**
  * 反射字段
  * */
 public static void setAndGetField() {
  try {
   //加载类,注意:加载类时,需要把包名也写入,这里的Penson没有包名,是因为直接建在default包的
   Class classzz=Class.forName("Penson");
   //实例化类
   Penson p= (Penson) classzz.newInstance();
  
   /********************获得所有字段**********************************/
   Field[] f= classzz.getFields();
   System.out.println("字段名:");
   //遍历所有字段,并且输出字段名
   for (Field field : f) {
    System.out.println(field.getName());
   }
   System.out.println("字段值:");
   for (Field field : f) {
    //要拿到字段的值,必须传个对象,说明是我要调用的是这个对象里面的字段
    System.out.println(field.get(p));
   }
   
   /************************获取指定的字段和为其赋值***************************************/
   System.out.println("为字段的赋值:");
   //获取指定的字段
   Field f1= classzz.getField("age");
   //设置字段的值
   f1.set(p, 12);
   System.out.println("age="+classzz.getField("age").get(p));
   
   /************************获取私有字段****************************************/
   System.out.println("私有成员:");
   f1=classzz.getDeclaredField("job");//获取私有字段
   f1.setAccessible(true);//暴力反射,如果不通过暴力反射,则拿不到私有的成员
   f1.set(p, "学生");//为job字段赋值
   System.out.println("obj="+f1.get(p));//获取job字段的值
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

/**
  * 反射方法
  * */
 public static void getMethod() {
  try {
   //加载类
   Class clazz= Class.forName("Penson");
   //实例化对象
   Penson p=(Penson) clazz.newInstance();
   
   /********************获取所有方法,除了私有*******************************/
   Method[] ms= clazz.getMethods();//获取所有方法
   //输出所有方法名
   System.out.println("方法名:");
   for (Method method : ms) {
    System.out.println(method.getName());
   }
   //运行方法
   for (Method method : ms) {
    try {
     //调用p对象中的带几个参数的方法
     method.invoke(p, null);
    } catch (Exception e) {
    } 
   }
   
   /*********************调用指定带2个参数的方法***************************/
   Method m= clazz.getMethod("say", String.class,int.class);//获取带两个参数的方法的对象
   m.invoke(p, "张三",23);//运行方法,并给定参数
   
   /**********************获取静态方法******************************************/
   m=clazz.getMethod("sayStatic", null);
   m.invoke(null, null);//因为静态方法可以不给对象名,也可以给m.invoke(p, null);
   
   /*************************获取私有方法*******************************************/
   m=clazz.getDeclaredMethod("says", null);
   m.setAccessible(true);//暴力反射
   m.invoke(p, null);
   
   /*************************获取带返回类型的方法********************************************/
   m=clazz.getMethod("sayReturn", null);
   //判断返回类型
   if(m.getReturnType()==int.class){
    int num=(Integer)m.invoke(p, null);
    System.out.println(num);
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

/**
  * 反射构造方法
  * */
 public static void getConstructor() {
  try {
   //加载类
   Class clazz= Class.forName("Penson");
   //实例化对象
   Penson p=(Penson) clazz.newInstance();
   
   /***********************获取公共的构造方法*********************************/
   Constructor[] cons=clazz.getConstructors();
   System.out.println("公共的构造方法:");
   for (Constructor constructor : cons) {
    System.out.println(constructor.getName());
   }
   
   /**********************获取指定构造方法*************************************/
   Constructor constructor=clazz.getConstructor(int.class,String.class);//获取指定的构造函数
   Penson p1= (Penson) constructor.newInstance(12,"张三");//通过构造方法创建penson实例
   System.out.println(p1.name);
   
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

原文地址:https://www.cnblogs.com/danmao/p/3826957.html