注解
注解入门
什么是注解
package 什么是注解;
public class Test01 {
@Override
public String toString ( ) {
return super . toString ( ) ;
}
}
内置注解
package 什么是注解;
@SuppressWarnings ( "all" )
public class Test01 {
@Override
public String toString ( ) {
return super . toString ( ) ;
}
@Deprecated
public static void test ( ) {
System. out. println ( "Deprecated" ) ;
}
}
自定义注解,元注解
元注解
package 元注解;
import java. lang. annotation. *;
public class Test01 {
}
@Target ( value = { ElementType. METHOD, ElementType. TYPE} )
@Retention ( value = RetentionPolicy. RUNTIME)
@Documented
@Inherited
@interface MyAnnotation {
}
自定义注解
package 自定义注解;
import java. lang. annotation. ElementType;
import java. lang. annotation. Retention;
import java. lang. annotation. RetentionPolicy;
import java. lang. annotation. Target;
public class Test01 {
@MyAnnotation2 ( age = 18 , schools = "清华大学" )
public void test02 ( ) {
}
@MyAnnotation3 ( "注解" )
public void test03 ( ) {
}
}
@Target ( value = { ElementType. TYPE, ElementType. METHOD} )
@Retention ( RetentionPolicy. RUNTIME)
@interface MyAnnotation2 {
String name ( ) default "" ;
int age ( ) ;
int id ( ) default - 1 ;
String[ ] schools ( ) default { "清华大学" , "北京大学" } ;
}
@Target ( value = { ElementType. TYPE, ElementType. METHOD} )
@Retention ( RetentionPolicy. RUNTIME)
@interface MyAnnotation3 {
String value ( ) ;
}
反射机制
Java反射机制概述
静态 VS 动态语言 Java Reflection Java反射机制研究及应用 Java反射优点和缺点 反射相关的主要API
理解Class类并获取Class实例
Class类
package 获得反射对象;
public class Test01 {
public static void main ( String[ ] args) throws ClassNotFoundException {
Class c1 = Class. forName ( "获得反射对象.User" ) ;
System. out. println ( c1) ;
Class c2 = Class. forName ( "获得反射对象.User" ) ;
Class c3 = Class. forName ( "获得反射对象.User" ) ;
Class c4 = Class. forName ( "获得反射对象.User" ) ;
System. out. println ( c2. hashCode ( ) ) ;
System. out. println ( c3. hashCode ( ) ) ;
System. out. println ( c4. hashCode ( ) ) ;
}
}
class User {
String name;
int id;
int age;
public User ( ) {
}
public User ( String name, int id, int age) {
this . name = name;
this . id = id;
this . age = age;
}
public String getName ( ) {
return name;
}
public void setName ( String name) {
this . name = name;
}
public int getId ( ) {
return id;
}
public void setId ( int id) {
this . id = id;
}
public int getAge ( ) {
return age;
}
public void setAge ( int age) {
this . age = age;
}
@Override
public String toString ( ) {
return "User{" +
"name='" + name + '\'' +
", id=" + id +
", age=" + age +
'}' ;
}
}
Class类 Class类的常用方法 获取class类的实例 哪些类型可以有class对象
类的加载与ClassLoader
了解:类的加载过程 类的加载与ClassLoader的理解
package 类加载内存分析;
public class Teat01 {
public static void main ( String[ ] args) {
A a = new A ( ) ;
System. out. println ( a. m) ;
}
}
class A {
static {
System. out. println ( "A类静态代码块初始化" ) ;
int m= 300 ;
}
static int m= 100 ;
public A ( ) {
System. out. println ( "A类静态代码块初始化" ) ;
}
}
什么时候会发生类初始化?
package 分析类初始化;
public class Test01 {
public static void main ( String[ ] args) throws ClassNotFoundException {
System. out. println ( Son. M) ;
}
}
class Father {
static int b = 2 ;
static {
System. out. println ( "父类被加载" ) ;
}
}
class Son extends Father {
static {
System. out. println ( "子类被加载" ) ;
m = 300 ;
}
static int m= 100 ;
static final int M= 1 ;
}
类加载器的作用 在这里插入图片描述
package 类加载器;
public class Test01 {
public static void main ( String[ ] args) throws ClassNotFoundException {
ClassLoader systemClassLoader = ClassLoader. getSystemClassLoader ( ) ;
System. out. println ( systemClassLoader) ;
ClassLoader parent = systemClassLoader. getParent ( ) ;
System. out. println ( parent) ;
ClassLoader parent1 = parent. getParent ( ) ;
System. out. println ( parent1) ;
ClassLoader aClass = Class. forName ( "类加载器.Test01" ) . getClassLoader ( ) ;
System. out. println ( aClass) ;
ClassLoader classLoader = Class. forName ( "java.lang.Object" ) . getClassLoader ( ) ;
System. out. println ( classLoader) ;
System. out. println ( System. getProperty ( "java.class.path" ) ) ;
}
}
创建运行时类的对象
获取运行时类的完整结构
package 获得类的运行时结构;
import java. lang. reflect. Constructor;
import java. lang. reflect. Field;
import java. lang. reflect. Method;
public class Test01 {
public static void main ( String[ ] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
Class c1 = Class. forName ( "获得反射对象.User" ) ;
System. out. println ( c1. getName ( ) ) ;
System. out. println ( c1. getSimpleName ( ) ) ;
System. out. println ( "------------------" ) ;
Field[ ] fields = c1. getFields ( ) ;
fields = c1. getDeclaredFields ( ) ;
for ( Field field : fields) {
System. out. println ( field) ;
}
System. out. println ( "------------------" ) ;
Field name = c1. getDeclaredField ( "name" ) ;
System. out. println ( name) ;
System. out. println ( "------------------" ) ;
Method[ ] methods = c1. getMethods ( ) ;
for ( Method method : methods) {
System. out. println ( "正常的" + method) ;
}
methods= c1. getDeclaredMethods ( ) ;
for ( Method method : methods) {
System. out. println ( "getDeclaredMethods" + method) ;
}
System. out. println ( "------------------" ) ;
Method getName = c1. getMethod ( "getName" , null) ;
Method setName = c1. getMethod ( "setName" , String. class ) ;
System. out. println ( getName) ;
System. out. println ( setName) ;
System. out. println ( "------------------" ) ;
Constructor[ ] constructors = c1. getConstructors ( ) ;
for ( Constructor constructor : constructors) {
System. out. println ( constructor) ;
}
constructors= c1. getDeclaredConstructors ( ) ;
for ( Constructor constructor : constructors) {
System. out. println ( "#" + constructor) ;
}
System. out. println ( "------------------" ) ;
Constructor declaredConstructor = c1. getDeclaredConstructor ( String. class , int . class , int . class ) ;
System. out. println ( "指定" + declaredConstructor) ;
}
}
调用运行时类的指定结构
有了Class对象,能做些什么?
package 动态创建对象执行方法;
import 获得反射对象. User;
import java. lang. reflect. Constructor;
import java. lang. reflect. Field;
import java. lang. reflect. InvocationTargetException;
import java. lang. reflect. Method;
public class Test01 {
public static void main ( String[ ] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
Class c1 = Class. forName ( "获得反射对象.User" ) ;
User user = ( User) c1. newInstance ( ) ;
System. out. println ( user) ;
Constructor constructor = c1. getDeclaredConstructor ( String. class , int . class , int . class ) ;
User user1 = ( User) constructor. newInstance ( "张三" , 001 , 18 ) ;
System. out. println ( user1) ;
User user2 = ( User) c1. newInstance ( ) ;
Method setName = c1. getDeclaredMethod ( "setName" , String. class ) ;
setName. invoke ( user2, "张三" ) ;
System. out. println ( user2. getName ( ) ) ;
User user3 = ( User) c1. newInstance ( ) ;
Field name = c1. getDeclaredField ( "name" ) ;
name. setAccessible ( true ) ;
name. set ( user3, "李四" ) ;
System. out. println ( user3. getName ( ) ) ;
}
}
setAccessible
package 性能对比分析;
import 获得反射对象. User;
import java. lang. reflect. InvocationTargetException;
import java. lang. reflect. Method;
public class Test01 {
public static void test01 ( ) {
User user = new User ( ) ;
long startTime= System. currentTimeMillis ( ) ;
for ( int i = 0 ; i < 100000000 ; i++ ) {
user. getName ( ) ;
}
long endTime= System. currentTimeMillis ( ) ;
System. out. println ( "普通方法执行10亿次" + ( endTime- startTime) + "ms" ) ;
}
public static void test02 ( ) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
User user = new User ( ) ;
Class c1 = user. getClass ( ) ;
Method getName = c1. getDeclaredMethod ( "getName" , null) ;
long startTime= System. currentTimeMillis ( ) ;
for ( int i = 0 ; i < 100000000 ; i++ ) {
getName. invoke ( user, null) ;
}
long endTime= System. currentTimeMillis ( ) ;
System. out. println ( "反射方法执行10亿次" + ( endTime- startTime) + "ms" ) ;
}
public static void test03 ( ) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
User user = new User ( ) ;
Class c1 = user. getClass ( ) ;
Method getName = c1. getDeclaredMethod ( "getName" , null) ;
getName. setAccessible ( true ) ;
long startTime= System. currentTimeMillis ( ) ;
for ( int i = 0 ; i < 100000000 ; i++ ) {
getName. invoke ( user, null) ;
}
long endTime= System. currentTimeMillis ( ) ;
System. out. println ( "关闭检测执行10亿次" + ( endTime- startTime) + "ms" ) ;
}
public static void main ( String[ ] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
test01 ( ) ;
test02 ( ) ;
test03 ( ) ;
}
}
package 获取注解信息;
import java. lang. annotation. *;
public class Test01 {
public static void main ( String[ ] args) throws ClassNotFoundException, NoSuchFieldException {
Class c1 = Class. forName ( "获取注解信息.Student02" ) ;
Annotation[ ] annotations = c1. getAnnotations ( ) ;
for ( Annotation annotation : annotations) {
System. out. println ( annotation) ;
}
Table table = ( Table) c1. getAnnotation ( Table. class ) ;
System. out. println ( table. value ( ) ) ;
java. lang. reflect. Field f = c1. getDeclaredField ( "name" ) ;
Field annotation = f. getAnnotation ( Field. class ) ;
System. out. println ( annotation. columnName ( ) ) ;
System. out. println ( annotation. type ( ) ) ;
System. out. println ( annotation. length ( ) ) ;
}
}
@Table ( "db-student" )
class Student02 {
@Field ( columnName = "db-id" , type = "int" , length = 10 )
private int id;
@Field ( columnName = "db-age" , type = "int" , length = 10 )
private int age;
@Field ( columnName = "db-name" , type = "varChar" , length = 3 )
private String name;
public Student02 ( ) {
}
public Student02 ( int id, int age, String name) {
this . id = id;
this . age = age;
this . name = name;
}
public int getId ( ) {
return id;
}
public void setId ( int id) {
this . id = id;
}
public int getAge ( ) {
return age;
}
public void setAge ( int age) {
this . age = age;
}
public String getName ( ) {
return name;
}
public void setName ( String name) {
this . name = name;
}
@Override
public String toString ( ) {
return "Student02{" +
"id=" + id +
", age=" + age +
", name='" + name + '\'' +
'}' ;
}
}
@Target ( ElementType. TYPE)
@Retention ( RetentionPolicy. RUNTIME)
@interface Table {
String value ( ) ;
}
@Target ( ElementType. FIELD)
@Retention ( RetentionPolicy. RUNTIME)
@interface Field {
String columnName ( ) ;
String type ( ) ;
int length ( ) ;
}