注解:(图片截自狂神)
annotation
可以被其他程序读取
内置注解:
元注解:
package Annotion;
import java.lang.annotation.*;
//元注解
//一个源文件只有一个public修饰的类
public class demo2 {
@Myannotation
public void test1(){
}
}
//target表示我们的注解可以用在那些地方
@Target(value = ElementType.METHOD)//.method意味着只能在方法上注解,在类上就会报错
//Retention表示我们的注解在什么时候有效
//Runtime>Class>Source
@Retention(RetentionPolicy.RUNTIME)
//Documented表示是否将我们的注解生成在javadoc中
@Documented
//Inherited子类可以继承父类的注解
@Inherited
//自己定义一个注解
@interface Myannotation{
}
自定义注解:
package Annotion;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//自定义注解
public class Test1 {
@Myannotation()//因为有default 所以里面的name参数可以为空
public void t1(){
}@MyAnnotation1("")//value的时候可以将值默认,不需写出实际的值
public void t2(){
}
}
@Target(value = ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{
//注解的参数:参数类型+参数名()
String name() default "";//default 默认参数为空
int id() default -1;//如果默认值为-1,代表不存在,类似于indexof
String[] school() default {"清华","北大"};
}
@interface MyAnnotation1{
String value();//默认参数是value,当不定义其他参数时候,value的值是可以省略的
}
反射:reflection
package AnoRef.Ref;
//测试Class类的创建方式有哪些
public class Test2 {
public static void main(String[] args) throws ClassNotFoundException {
//方式一:通过对象获得
Person p1 = new Stu();
System.out.println("这个人是:"+p1.name);
Class c1 = p1.getClass();
System.out.println(c1.hashCode());
//方式二:用forname获得
Class c2 =Class.forName("AnoRef.Ref.Stu");
System.out.println(c2.hashCode());
//方式三:通过类名.class获得
Class c3 = Stu.class;
System.out.println(c3.hashCode());
//方式四:基本内置类型的包装类都有一个Type属性
Class c4= Integer.TYPE;
System.out.println(c4);
//获得父类类型
Class c5 = c1.getSuperclass();
System.out.println(c5);
}
}
class Person{
String name;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person(String name) {
this.name = name;
}
public Person() {
}
}
class Stu extends Person{
public Stu() {
this.name="学生";
}
}
class Tech extends Person{
public Tech() {
this.name="老师";
}
}
package AnoRef.Ref;
import java.lang.annotation.ElementType;
//所有类型的Class
public class Test3 {
public static void main(String[] args) {
Class c1 = Object.class;//类
Class c2 = Comparable.class;//接口
Class c3 = String[].class;//一维数组
Class c4 = int[][].class;//二维数组
Class c5 = Override.class;//注解
Class c6 = ElementType.class;//枚举类型
Class c7 = Integer.class;//基本数据类类
Class c8 = void.class;//void
Class c9 = Class.class;//Class
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
System.out.println(c4);
System.out.println(c5);
System.out.println(c6);
System.out.println(c7);
System.out.println(c8);
System.out.println(c9);
//根据类型判断,只要是一个相同的类,就有唯一一个Class对象
//输出的hashcode是一样的说明相同类的地层Class是同一个
//只要元素类型和维度(就是一维数组,二维数组)一样,就是同一个Class
int[] a = new int[5];
int[] b = new int[10];
System.out.println(a.getClass().hashCode());
System.out.println(b.getClass().hashCode());
}
}