注解
java.Annotation
Annotation的作用:可以呗其他程序读取
Annotation的格式
注解是:@注释名 在代码中存在,还可以添加一些参数
@SuppressWarnings(values="unchecked")
通过反射,可以访问数据。
内置注解
@SuppressWarings:定义在java.lang.SuppressWarings中,用来抑制编译时的警告信息。
此方法需要传入参数。
public class Demo01 extends Object { //重写的注解 @Override public String toString() { return super.toString(); } //不推荐使用的注解,但是可以使用 @Deprecated public static void test() { System.out.println("Deprecated"); } @SuppressWarnings("all") public static void test2() { ArrayList arrayList = new ArrayList(); } public static void main(String[] args) { test(); }}
元注解
元注解就是负责注解其他的注解,Java定义了四个标准的meta-annotation类型,他们用来提供对其他annotation类型操作说明
可以从java.lang.annotation中找到(@Target,@Retention,@Docimented,@Inherited)
@Target:用于描述注解的使用范围({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention:标识需要在什么级别保存该注解信息,用于描述注解的生命周期(SOURCE
@Docimented:说明注解将被包含在javadoc中
@Inherited:说明子类可以继承父类中的该注解
自定义注解
使用@interface自定义注解
格式
public @interface MyAnnotation{}
public class Demo02 { //注解可以显示的复制,如果没有默认值,就一定要注解赋值 @MyAnnotation(name = "nice",schools = {"1234","2314"}) public void test(){}@MyAnnotation2("sdf") public void test2(){}}@Target(value = {ElementType.METHOD,ElementType.TYPE})@Retention(value =RetentionPolicy.RUNTIME)@interface MyAnnotation{ //注解的参数:参数类型 参数名(); String name() default ""; int age() default 0; int id() default -1;//代表不存在。 String[] schools() default {"erq","asds"};}@Target(value = {ElementType.METHOD,ElementType.TYPE})@Retention(value =RetentionPolicy.RUNTIME)@interface MyAnnotation2{ //注解的参数:参数类型 参数名(); String value() default "";}
反射
java.Reflection
反射机制允许程序在执行期间借助Reflection API获取任何类的内部信息,并能直接操作任意对象的内部属性级方法
Class c= Class.forName("java.lang.String")
获得反射对象
public class Demo03 { public static void main(String[] args) throws ClassNotFoundException { //通过反射获取类的class对象 Class c1 = Class.forName("com.darker.demo01.User"); Class c2 = Class.forName("com.darker.demo01.User"); Class c3 = Class.forName("com.darker.demo01.User"); //一个类在内存中只有一个Class对象 //一个类被加载后,类的整个结构都会被装在Class对象中 System.out.println(c1.hashCode()); System.out.println(c2.hashCode()); System.out.println(c3.hashCode()); }}
Class对象
方法名
功能说明
static ClassforName(String name)
返回指定类名name的Class对象
Object newInstance()
调用缺省构造函数,返回Class对象的一个实例
getName()
返回此Class对象锁标识的实体(类、接口、数组类或void)的名称
Class getSuperClass()
返回房钱Class对象的父类的Class对象
Class[] getinterfaces()
获取房钱Class对象的接口
ClassLoader getClassLoader()
返回该类的类加载器
Constructor[] getConstructors()
返回一个包含某些Constructor对象的数组
Method getMethod(String name,Class...T)
返回一个Method对象,此对象的类型类paramaType
Field[] GetDeclaredFields()
返回Field对象的一个数组
获取Class对象
public class Demo04 { public static void main(String[] args) throws ClassNotFoundException { Person person = new Student(); System.out.println("这个人是"+person.name); //方式一:通过对象获得 Class c1 = person.getClass(); System.out.println(c1.hashCode()); //方式二:forname获得 Class c2 = Class.forName("com.darker.demo01.Student"); System.out.println(c2.hashCode()); //方式三:通过类名.class获得 Class c3 = Student.class; System.out.println(c3.hashCode()); //方式四,基本内置类型的包装类都有一个type属性 Class c4 = Integer.TYPE; System.out.println(c4.hashCode()); //获得父类类型 Class c5 = c1.getSuperclass(); System.out.println(c5); }}class Person{ public String name; public Person() { } Person(String name) { this.name = name; } @Override.........