通过反射可以获取Class的构造方法 通过构造方法创建对象

来源:互联网 发布:java 读取文件内容 编辑:程序博客网 时间:2024/06/04 18:00



package com.example.app3.fanshe;/** * Created by gq on 2017/11/28. * * 1.可以反射到属性 有构造方法 私有的构造方法 方法 私有学的等 * 通过对应的参数找到构造方法 */public class User {      public String name;      public String age;      public User(){      }       //构造方法    public User(String name, String age) {        this.name = name;        this.age = age;    }    public void  play()    {    }  /*  private void eat(){    }     public  void  sleep()     {     }*/    @Override    public String toString() {        return "User{" +                "name='" + name + '\'' +                ", age='" + age + '\'' +                '}';    }}


 Text 测试 类

 

package com.example.app3.fanshe;import java.lang.reflect.Constructor;/** * Created by gq on 2017/11/28. */public class Test {    public static void main(String[] args) {             //拿到user类的路径        try {            Class aClass = Class.forName("com.example.app3.fanshe.User");            Constructor[] constructors = aClass.getConstructors();//获取所有方法            for (Constructor constructor:constructors){                  System.out.println("constructor = " + constructor);               }              //获取单个的方法            Constructor constructor1 = aClass.getConstructor();//传与构造方法对应的东西            System.out.println("constructors = " + constructor1);            //constructors = public com.example.app3.fanshe.User()            // 反射得到有参g构造方法 得对应a           Constructor constructor2 = aClass.getConstructor(String.class, String.class);            System.out.println("constructor = " + constructor2);            //constructor = public com.example.app3.fanshe.User(java.lang.String,java.lang.String)            //二丶 通过构造方法来创建对象  构造方法可以传参数            User user= (User) constructor2.newInstance("我是郭强","我21岁");            System.out.println("constructor2 = " + constructor2);             //constructor2 = public com.example.app3.fanshe.User(java.lang.String,java.lang.String)            System.out.println("user = " + user);           // user = User{name='我是郭强', age='我21岁'}  修改值了          /*  //反射获取到所有方法  public            Method[] methods = aClass.getMethods();           for (Method method:methods)           {               System.out.println("method = " + method);           }*/        } catch (Exception e) {            e.printStackTrace();        }    }}

获取私有

            //三丶 获取私有的方法getDeclaredConstructors 获取私有和public 的            Constructor[] declaredConstructors = aClass.getDeclaredConstructors();            for (Constructor constructor3:declaredConstructors)            {                System.out.println("私有化的方法 = " + constructor3);            }               //已知第一个是私有的方法                Constructor constructor3=declaredConstructors[0];                   constructor3.setAccessible(true); //有序访问              User user1= (User) constructor3.newInstance("我是","过","强");              System.out.println("user1 = " + user1.toString());/** 私有化的方法 = private com.example.app3.fanshe.User(java.lang.String,java.lang.String,java.lang.String)私有化的方法 = public com.example.app3.fanshe.User(java.lang.String,java.lang.String)私有化的方法 = public com.example.app3.fanshe.User()user1 = User{name='我是', age='过', sex='强'}

 

//加注解的  给方法加注解 

 

package com.example.app3.fanshe;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * Created by gq on 2017/11/29. */  //这里是注解作用区域    @Target(ElementType.METHOD)    @Retention(RetentionPolicy.RUNTIME)    //注解保留时长短public @interface Bwei {  //注解           public  String  name() default "1509D呀";          public  String  sex() default  "男";    }

package com.example.app3.fanshe;import java.lang.reflect.Field;import java.lang.reflect.Method;/** * Created by gq on 2017/11/28. */public class Test {    public static void main(String[] args) {             //拿到user类的路径        try {            Class aClass = Class.forName("com.example.app3.fanshe.User");            Field[] fields = aClass.getDeclaredFields();               for (Field field:fields)               {                   System.out.println("field = " + field);               }        /*        field = public java.lang.String com.example.app3.fanshe.User.name        field = public java.lang.String com.example.app3.fanshe.User.age        field = private java.lang.String com.example.app3.fanshe.User.sex                       */            Method method =  aClass.getMethod("sleep"); //找到那个方法            //判断方法上是否有这个注解            boolean isEmpty =  method.isAnnotationPresent(Bwei.class);            if(isEmpty){                // 获取对应的注解                Bwei bwei =  method.getAnnotation(Bwei.class); //获取注解里面的值                System.out.println("bwei = " + bwei.name()+ " "+ bwei.sex()); //获取注解里的值                //bwei = 郭强强 二十   打印出来的是  @Bwei(name = "郭强强",sex = "二十") 的                //使用invoke运行注解方法(10分)            }        } catch (Exception e) {            e.printStackTrace();        }    }}

这是在类那个user 类里面 

 @Bwei(name = "郭强强",sex = "二十")public  void  sleep() {     System.out.println("Sleep-name = "); }



 


 

阅读全文
0 0
原创粉丝点击