注解:
@注解名(字段名)
注解三要素;
目标:对什么起作用(字段,类等)
范围:源文件,字节码文件,运行时文件
四大内置注解
@override覆写的方法
@deprecated过时方法
@suppersWrings 去掉黄色!警告
@salevararg 也是去掉警告比上面的高端
四大元注解:注解的注解
@Target 目标(能用在哪里如:字段,类,方法等)
@retention 生命周期(源文件,字节码文件,运行时)
@Doucment 能在转化为DOC文件的时候把注解也标识出来
@inherited 继承也有父类注解的所以信息
实现功能
自定义注解
//能使用的范围 @Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD}) //生命周期 @Retention(RetentionPolicy.SOURCE) public @interface Vip { String name(); byte level(); } public class Person { @Vip(name="钻石会员",level=120) public void level(){ } }
Class forName = Class.forName("java.lang.String"); System.out.println(forName); //System.out.println(String.class); String string="hello"; System.out.println(string.getClass()); Class forName1 = Class.forName("java.util.List"); System.out.println(forName1); System.out.println(List.class); int[] a=new int[5]; System.out.println(a.getClass()); //System.out.println(byte.class); Integer integer=3; System.out.println(integer.getClass()); System.out.println(Integer.TYPE);
作用:
清楚知道该注解下面的作用功能等,注解也可以帮我们完成一些事物
其实也是有但基本字段可以传入基本数据类型,枚举
想要有意义需要有第三方注解
反射
通过获得字节码文件来获得类的所有信息(构造方法,字段,方法)能够在运行时动态获得类的信息
作用:
动态获得信息,需要满足javaben的特点这样我们才知道用什么方法,可以获得私有的信息,会破坏封装获得方式,也是解决硬编码的一种方式
类:class.forname(“全民名(包名.类名)”);
类名.class
对象.getclass();
接口:class.forname(“全民名(包名.类名)”);
接口名.class
字段
数据类型.class
包装类
类名.type
通过反射使用方法
public static void main(String[] args) throws Exception { // TODO Auto-generated method stub Class<Student> c1 = (Class<Student>) Class.forName("cn.jiedada.getmethod.Student"); Method method = c1.getMethod("setName", String.class); Student student = c1.newInstance(); Object invoke = method.invoke(student, "小花"); System.out.println(student); //获得私有方法 Class<?> c2 = Class.forName("cn.jiedada.getmethod.Student"); Method method1 = c2.getDeclaredMethod("setAge", Integer.class); method.setAccessible(true); Object stu = c2.newInstance(); Object invoke1 = method.invoke(stu, 20); System.out.println(stu); //获得私有字段 Class<?> c3 = Class.forName("cn.jiedada.getmethod.Student"); Object object = c3.newInstance(); Field field = c3.getDeclaredField("age"); field.setAccessible(true); field.set(object, 20); System.out.println(object); //获得注解 Class<?> c4 = Class.forName("cn.jiedada.getmethod.Student"); //System.out.println(c4); Vip vip = c4.getAnnotation(Vip.class); System.out.println(vip); String name = vip.name(); System.out.println(name); }
public static void main(String[] args) throws Exception { // TODO Auto-generated method stub //调用无参构造 Class<Student> c1 = (Class<Student>) Class.forName("cn.jiedada.reflect.Student"); Student stu = c1.newInstance(); System.out.println(stu); //调用public的有参构造 Class<Student> c2 = (Class<Student>) Class.forName("cn.jiedada.reflect.Student"); Constructor<Student> constructor = c2.getConstructor(String.class); Student student = constructor.newInstance("小花"); System.out.println(student); //获得private的有参构造 Class<?> c3 = Class.forName("cn.jiedada.reflect.Student"); Constructor<?> constructor1 = c3.getDeclaredConstructor(String.class,Integer.class); constructor1.setAccessible(true); Object newInstance = constructor1.newInstance("小花",20); System.out.println(newInstance); }