JAVA反射
——反射机制
——反射作用:
java的反射机制就是增加程序的灵活性,避免将程序写死到代码里
反射的一些基本使用
获取类的一些方法
1、通过类名.class获取类
ReflectDemo d = new ReflectDemo();
Class c = ReflectDemo.class;
2、通过 Class.forName()传入全类名获取
ReflectDemo d = new ReflectDemo();
try {
Class c = Class.forName("ReflecctDemo.ReflectDemo");
System.out.println(c);
} catch (Exception e) {
e.printStackTrace();
}
3、通过对象实例 instance.getClass() 获取
ReflectDemo d = new ReflectDemo();
Class c = d.getClass();
System.out.println(c);
4、通过类加载器 ClassLoader.loadClass() 传入类路径 获取
ReflectDemo d = new ReflectDemo();
try {
Class c = ClassLoader.getSystemClassLoader().loadClass("ReflecctDemo.ReflectDemo");
System.out.println(c);
} catch (Exception e) {
e.printStackTrace();
}
获取类名
1.获取完整类名:包名+类名
getName()String name = UserClass.getName();
2、.获取简单类名:不包括包名 getSimpleName()
String simpleName = UserClass.getSimpleName();获取属性
3、获取所有公有属性public 修饰
getFields()Field[] fields = UserClass.getFields();
4、获取单个公有属性 getField("属性名")
Field field = UserClass.getField("hobby");
5、获取所有属性:公有+私有 getDeclaredFields()
Field[] fields0 = UserClass.getDeclaredFields();
6、获取单个属性:公有或者私有getDeclaredField("属性名")
Field nameField = UserClass.getDeclaredField("name");
构造方法
1、获取所有公有构造方法
getConstructors()Constructor[] constructors = UserClass.getConstructors();
2、获取与参数类型匹配的构造方法 getConstructor(参数类型)
Constructor constructor = UserClass.getConstructor(String.class,int.class,String.class,String.class);
成员方法
1.获取所有公共方法 getMethods() ;
Method[] methods = UserClass.getMethods();
2、获取某个公共方法 getMethod("方法名", 参数类型);
Method method = UserClass.getMethod("setName", String.class);
3、获取所有方法:公有+私有 getDeclaredMethods()
Method[] declaredMethods = UserClass.getDeclaredMethods();
4、执行成员方法 invoke(object,"方法参数") ;
Mothod method = Userclass.getDeclaredMethod("dododo");
User user = new User();
method.invoke(user);
创建类的实例
1.通过 Class 实例化对象 Class.newInstance();
User user4 = (User)UserClass.newInstance();
2.通过构造方法实例化对象 constructor.newInstance(参数值)
Constructor constructor = UserClass.getConstructor (String.class,int.class);
User user = (User)constructor.newInstance("aaa",18);
System.out.println("姓名:"user.getName()+"年龄"+user.getAge());
枚举
——枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。
颜色实例:
public enum ColorEnum {
Red("红色"),Blue("蓝色"),Black("黑色"),Yellow("黄色"),Green("绿色");
private String color;
//枚举类的构造函数是私有的
private ColorEnum(String color){
this.color = color;
}
public String a(){
return "(颜色是:"+color+")";
}
}
public class TaskMain {
public static void main(String[] args) {
for (ColorEnum e:ColorEnum.values()) {
System.out.println(e.a());
}
System.out.println(ColorEnum.valueOf("Red").a());
}
}
(颜色是:红色)
(颜色是:蓝色)
(颜色是:黑色)
(颜色是:黄色)
(颜色是:绿色)
(颜色是:红色)
注解
——注解可以放置在:类上面、属性上面、方法上面、构造方法上面、参数前面。
分类 | 注解 | 含义 |
---|---|---|
文档相关 | @Description | 表明类或方法的描述 |
@author | 标明开发该类模块的作者,多个作者之间使用,分割 | |
@version | 表明该类模块的版本 | |
@date | 表明开发日期 | |
@param | 对方法中某参数的说明,如果没有参数就不能写 | |
@return | 对方法返回值的说明,如果方法返回值类型是void就不用写 | |
编译时进行格式检查 | @Override | 限定重写父类方法,该注释只能用于开发 |
@Deprecated | 用于表示所修饰的元素(类,方法等)已过时,通常是因为所修饰的结构危害或存在更好的选择 | |
@SuppressWarings | 抑制编译器警告 | |
事务相关 | @Transactional | 事务处理 |
自定义注解
——@interface定义一个新的注解类型
注解的写法接口非常类似* ●可以描述public static final的属性(但是比较少见,因为final修饰了 就没法修改了,而我的l解携带信息的时候需要传值) ●可以描还public abstract的方法, 但促注解的方法要求必须有返回值,返回值的炎型只能是八种基本数据类型、String类型、 Class 类型、enum类型、Annotation类型、 以上所有类型的数组。 ●如果定义的注解里面有方法,那么在使用汪解的时候,方法是必须传递参数的。如果想不传参数也可以的话,需要给一个默认的值 。例如: String value() default "摩卡"*
——@Target 描述当前的这个注解可以修饰哪些程序元素
——@Retention 描述当前的这个注解存在什么作用域中的@Inherited 描述当前这个注解是否能被子类对象继承,写了就可以被继承
——@Document 描述当前这个注解是否能被文档所记录,写了就可以被记录
——@Override:限定父类方法,强制一个之类必须覆盖父类的方法。
——@Deprecated:标示某个类或方法已过时。当其他程序使用已过时的类、方法时,编译器会警告。
——@SuppressWarnings:抑制编译器警告。被标记的元素以及所有子元素都不会发出编译警告。
——@SafeVarargs:Java 7 提供的专门用于抑制 ”堆污染“ 警告。
——@FuncationalInterface:Java 8 提供的专门用于标识函数式接口的注解(只能标注接口)
实例: