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