zoukankan      html  css  js  c++  java
  • 反射,类,构造方法,方法,属性

    //要进行反射的类

    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();
      }
     }
    }

  • 相关阅读:
    ZOJ2334 Monkey King 并查集 STL
    ZOJ2286 Sum of Divisors 筛选式打表
    ZOJ2105 终于找到错误
    ZOJ-2091-Mean of Subsequence (反证法的运用!!)
    【9929】潜水员
    【9928】混合背包
    【t077】宝物筛选
    【9927】庆功会
    【9926】完全背包
    【9925】0/1背包
  • 原文地址:https://www.cnblogs.com/danmao/p/3826957.html
Copyright © 2011-2022 走看看