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



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 = ");

 }



 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值