注解与反射
注解
//内置注解
@Override :定义在java.lang.Override 中,此注释只适用于修辞方法﹐表示一个方法声明打算重写超类中的另一个方法声明.
@Deprecated:定义在java.lang.Deprecated中,此注释可以用于修辞方法﹐属性,类,表示不鼓励程序员使用这样的元素﹐通常是因为它很危险或者存在更好的选择.
@SuppressWarnings:定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息.
-与前两个注释有所不同,你需要添加一个参数才能正确使用,这些参数都是已经定义好了的,我们选择性的使用就好了.
@SuppressWarnings("all")
@SuppressWarnings("unchecked")
@SuppressWarnings(value={"unchecked","deprecation"})
//元注解
// Target表示我们的注解可以用在哪些地方。
@Target(value = {ElementType.METHOD,ElementType.TYPE})
// Retention表示我们的注解在什么地方还有效。
//runtime>class>sources
@Retention(value = RetentionPolicy.RUNTIME)
// Documented 表示是否将我们的注解生成在JAVAdoc中
@Documented
//Inherited子类可以继承父类的注解
@Inherited
@interface MyAnnotation{}
//自定义注解
√ @interface用来声明一个注解﹐格式: public@interface注解名{定义内容}
√其中的每一个方法实际上是声明了一个配置参数.
√方法的名称就是参数的名称.
√返回值类型就是参数的类型(返回值只能是基本类型,Class , String , enum ).
√可以通过default来声明参数的默认值
√如果只有一个参数成员,一般参数名为value
√注解元素必须要有值﹐我们定义注解元素时,经常使用空字符串,0作为默认值.
例子:
//自定义注解
public class Test03 {
//注解可以显示赋值,如果没有默认值,我们就必须给注解赋值
@MyAnnotation2 (name ="连星")
public void test(){}
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention (RetentionPolicy.RUNTIME)
@interface MyAnnotation2{
//注解的参数:参数类型+参数名();
String name() default "";
}
##lombok下的一些注解
@RestController//如果使用@RestController注解Controller层的话,则返回的是return里面的内容,无法返回到指定的页面
@RequestMapping("user")//用来映射请求,也就是通过它来指定控制器可以处理哪些URL请求
@CrossOrigin//允许跨域
@Slf4j//可以直接使用log对象
@AllArgsConstructor//会生成一个包含所有变量的构造方法,默认生成的方法是 public 的
@NoArgsConstructor//生成无参构造方法
@Accessors(chain = true)//用来直接调用get和set
@Mapper注解是由Mybatis框架中定义的一个描述数据层接口的注解,起描述性作用,用于告诉sprigng框架此接口的实现类由Mybatis负责创建,并将其实现类对象存储到spring容器中。
@Service注解用于类上,标记当前类是一个service类,加上该注解会将当前类自动注入到spring容器中
@Transactional 1.只能用在public方法上; 2.@Transactional注解只能回滚非检查型异常,具体untimeException及其子类和Error子类,可以从Spring源码的DefaultTransactionAttribute类里找到判断方法rollbackOn。
@Autowired注解(注入):
1.带有@Autowired注解(属性required默认为true)的构造方法,在Spring初始化对象实例时,会调用此构造函数,进行对象的实例化。
2.如果构造方法上带有了@Autowired注解,那么这个构造方法不是public修饰的,也可以被实例化。private修饰的,也可以被实例化出来。
3.当一个对象只有一个构造方法时,Spring实例化对象会默认选择这个构造方法进行实例化,无需加@Autowired注解。只有当多个构造方法存在时,才用加@Autowired注解,告诉Spring选择哪个构造方法进行实例化。
4.构造方法的@Autowired且required属性为true只允许存在一个。其他的@Autowired直接的required属性必须设置为false。
5.实例化带参数的构造方法时,Spring会先实例化构造方法中参数对象。
总结:当一个类中有多个构造方法,且我们要选择某一个构造方法进行Spring实例化时,可以在构造方法上加@Autowired注解。
反射
##Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部内部信息,并且直接操作任意对象的内部属性及方法。
Class c = Class.forName("java.lang.String")
##加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射
获取Class类的实例
a)若已知具体的类,通过类的class属性获取,该方法最为安全可靠,程序性能最高。
Class clazz = Person.class;
b)已知某个类的实例,调用该实例的getClass()方法获取Class对象
Class clazz= person.getClass();
c)已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,
可能抛出ClassNotFoundException
Class clazz = Class.forName("demo01.Student");
d)内置基本数据类型可以直接用类名.Type
e)还可以利用ClassLoader我们之后讲解
类加载器
public class ClassLoader1 {
public static void main ( String [ ] args) {
ClassLoader systemClassLoader = ClassLoader . getSystemClassLoader ( ) ;
System . out. println ( systemClassLoader) ;
ClassLoader extClassLoader = systemClassLoader. getParent ( ) ;
System . out. println ( extClassLoader) ;
ClassLoader bootStrapClassLoader = extClassLoader. getParent ( ) ;
System . out. println ( bootStrapClassLoader) ;
ClassLoader classLoader = ClassLoader1 . class . getClassLoader ( ) ;
System . out. println ( classLoader) ;
ClassLoader StringClassLoader = String . class . getClassLoader ( ) ;
System . out. println ( StringClassLoader ) ;
}
}