一、注解
1、什么是注解
2、内置注解
3、元注解
package com. cty. annotation ;
import java. lang. annotation. * ;
public class Test02 {
@MyAnnotation
public void test ( ) {
}
}
@@Target ( value = { ElementType . METHOD, ElementType . TYPE} )
@Retention ( value = RetentionPolicy . RUNTIME)
@Documented
@Inherited
@interface MyAnnotation {
}
4、自定义注解
二、反射机制
1、静态语言和动态语言
2、Java Reflection
3、Java反射机制的研究及应用
4、Java反射优点和缺点
5、反射相关的主要API
package com. cty. reflection ;
public class Test01 {
public static void main ( String [ ] args) throws ClassNotFoundException {
Class c1 = Class . forName ( "com.cty.reflection.User" ) ;
Class c2 = Class . forName ( "com.cty.reflection.User" ) ;
Class c3 = Class . forName ( "com.cty.reflection.User" ) ;
Class c4 = Class . forName ( "com.cty.reflection.User" ) ;
System . out. println ( c1. hashCode ( ) ) ;
System . out. println ( c2. hashCode ( ) ) ;
}
}
class User {
private String name;
private int id;
private 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 "Test01{" +
"name='" + name + '\'' +
", id=" + id +
", age=" + age +
'}' ;
}
}
6、class类
7、获取Class实例
package com. cty. reflection ;
public class Test2 {
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 ( ) ) ;
Class c2 = Class . forName ( "com.cty.reflection.Student" ) ;
System . out. println ( c2. hashCode ( ) ) ;
Class c3 = Student . class ;
System . out. println ( c3. hashCode ( ) ) ;
Class c4 = Integer . TYPE;
System . out. println ( c4) ;
Class c5 = c1. getSuperclass ( ) ;
System . out. println ( c5) ;
}
}
class Person {
public String name;
public Person ( String name) {
this . name = name;
}
public Person ( ) {
}
@Override
public String toString ( ) {
return "Person{" +
"name='" + name + '\'' +
'}' ;
}
}
class Teacher extends Person {
public Teacher ( ) {
this . name = "老师" ;
}
}
class Student extends Person {
public Student ( ) {
this . name = "学生" ;
}
}
8、哪些类可以有Class对象
package com. cty. reflection ;
import java. lang. annotation. ElementType ;
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 ;
Class c9 = 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) ;
int [ ] a = new int [ 10 ] ;
int [ ] b = new int [ 100 ] ;
System . out. println ( a. getClass ( ) . hashCode ( ) ) ;
System . out. println ( b. getClass ( ) . hashCode ( ) ) ;
}
}
9、类的加载过程
10、类的加载与ClassLoader的理解
package com. cty. reflection ;
public class Test4 {
public static void main ( String [ ] args) {
A a = new A ( ) ;
System . out. println ( A . m) ;
}
}
class A {
static {
System . out. println ( "A类静态代码块初始化" ) ;
m = 300 ;
}
static int m = 100 ;
public A ( ) {
System . out. println ( "A类的无参构造初始化" ) ;
}
}
11、什么时候会发生类的初始化
1️⃣ 发生初始化
package com. cty. reflection ;
public class Test5 {
static {
System . out. println ( "Main类被加载" ) ;
}
public static void main ( String [ ] args) throws ClassNotFoundException {
Son son = new Son ( ) ;
Class . forName ( "com.cty.reflection.Son" ) ;
}
}
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 ;
}
2️⃣ 不发生初始化
package com. cty. reflection ;
public class Test5 {
static {
System . out. println ( "Main类被加载" ) ;
}
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 ;
}
12、类加载器的作用
package com. cty. reflection ;
public class Test6 {
public static void main ( String [ ] args) throws ClassNotFoundException {
ClassLoader classLoader = ClassLoader . getSystemClassLoader ( ) ;
System . out. println ( classLoader) ;
ClassLoader parent = classLoader. getParent ( ) ;
System . out. println ( parent) ;
ClassLoader parent1 = parent. getParent ( ) ;
System . out. println ( parent1) ;
ClassLoader classLoader1 = Class . forName ( "com.cty.reflection.Test6" ) . getClassLoader ( ) ;
System . out. println ( classLoader1) ;
classLoader1 = Class . forName ( "java.lang.Object" ) . getClassLoader ( ) ;
System . out. println ( classLoader1) ;
System . out. println ( System . getProperty ( "java.class.path" ) ) ;
}
}
13、获取运行时类的完整对象
package com. cty. reflection ;
import java. lang. reflect. Constructor ;
import java. lang. reflect. Field ;
import java. lang. reflect. Method ;
public class Test7 {
public static void main ( String [ ] args) throws ClassNotFoundException , NoSuchFieldException , NoSuchMethodException {
Class c1 = Class . forName ( "com.cty.reflection.User" ) ;
System . out. println ( c1. getName ( ) ) ;
System . out. println ( c1. getSimpleName ( ) ) ;
Field [ ] fields = c1. getDeclaredFields ( ) ;
for ( Field field : fields) {
System . out. println ( field) ;
}
Field name = c1. getDeclaredField ( "name" ) ;
System . out. println ( name) ;
c1. getMethods ( ) ;
Method [ ] methods = c1. getMethods ( ) ;
for ( Method method : methods) {
System . out. println ( "正常的" + method) ;
}
methods = c1. getDeclaredMethods ( ) ;
for ( Method method : methods) {
System . out. println ( "getDeclaredMethods" + method) ;
}
Method method1 = c1. getMethod ( "getName" , null ) ;
Method method2= c1. getMethod ( "setName" , String . class ) ;
System . out. println ( method1) ;
System . out. println ( method2) ;
Constructor [ ] constructors = c1. getConstructors ( ) ;
for ( Constructor constructor : constructors) {
System . out. println ( constructor) ;
}
constructors = c1. getDeclaredConstructors ( ) ;
for ( Constructor constructor : constructors) {
System . out. println ( "#" + constructor) ;
}
Constructor constructor = c1. getDeclaredConstructor ( String . class , int . class , int . class ) ;
System . out. println ( "指定构造器" + constructor) ;
}
}
14、有了Class对象,能做什么?
1️⃣调用指定方法
2️⃣ setAccessible
package com. cty. reflection ;
import java. lang. reflect. Constructor ;
import java. lang. reflect. Field ;
import java. lang. reflect. InvocationTargetException ;
import java. lang. reflect. Method ;
public class Test8 {
public static void main ( String [ ] args) throws ClassNotFoundException , InstantiationException , IllegalAccessException , NoSuchMethodException , InvocationTargetException , NoSuchFieldException {
Class c1 = Class . forName ( "com.cty.reflection.User" ) ;
User user = ( User ) c1. newInstance ( ) ;
System . out. println ( user) ;
Constructor constructor = c1. getDeclaredConstructor ( String . class , int . class , int . class ) ;
User user2 = ( User ) constructor. newInstance ( "cty" , 1 , 1 ) ;
System . out. println ( user2) ;
User user3 = ( User ) c1. newInstance ( ) ;
Method setName = c1. getDeclaredMethod ( "setName" , String . class ) ;
setName. invoke ( user3, "ccc" ) ;
System . out. println ( user3) ;
User user4 = ( User ) c1. newInstance ( ) ;
Field name = c1. getDeclaredField ( "name" ) ;
name. setAccessible ( true ) ;
name. set ( user4, "kc" ) ;
System . out. println ( user4. getName ( ) ) ;
}
}
三、性能对比分析
package com. cty. reflection ;
import java. lang. reflect. InvocationTargetException ;
import java. lang. reflect. Method ;
public class Test9 {
public static void test1 ( ) {
User user = new User ( ) ;
long startTime = System . currentTimeMillis ( ) ;
for ( int i = 0 ; i < 1000000000 ; i++ ) {
user. getName ( ) ;
}
long endTime = System . currentTimeMillis ( ) ;
System . out. println ( "普通方式执行10亿次:" + ( endTime - startTime) + "ms" ) ;
}
public static void test2 ( ) 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 < 1000000000 ; i++ ) {
getName. invoke ( user) ;
}
long endTime = System . currentTimeMillis ( ) ;
System . out. println ( "反射方式执行10亿次:" + ( endTime - startTime) + "ms" ) ;
}
public static void test3 ( ) 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 < 1000000000 ; i++ ) {
getName. invoke ( user) ;
}
long endTime = System . currentTimeMillis ( ) ;
System . out. println ( "反色方式+关闭安全检测执行10亿次:" + ( endTime - startTime) + "ms" ) ;
}
public static void main ( String [ ] args) throws InvocationTargetException , NoSuchMethodException , IllegalAccessException {
test1 ( ) ;
test2 ( ) ;
test3 ( ) ;
}
}
四、反射操作泛型
package com. cty. reflection ;
import java. lang. reflect. Method ;
import java. lang. reflect. ParameterizedType ;
import java. lang. reflect. Type ;
import java. util. List ;
import java. util. Map ;
public class Test10 {
public void test1 ( Map < String , User > map, List < User > list) {
System . out. println ( "test1" ) ;
}
public Map < String , User > test2 ( ) {
System . out. println ( "test2" ) ;
return null ;
}
public static void main ( String [ ] args) throws NoSuchMethodException {
Method method = Test10 . class . getMethod ( "test1" , Map . class , List . class ) ;
Type [ ] genericParameterTypes = method. getGenericParameterTypes ( ) ;
for ( Type genericParameterType : genericParameterTypes) {
System . out. println ( "#" + genericParameterType) ;
if ( genericParameterType instanceof ParameterizedType ) {
Type [ ] actualTypeArguments = ( ( ParameterizedType ) genericParameterType) . getActualTypeArguments ( ) ;
for ( Type actualTypeArgument : actualTypeArguments) {
System . out. println ( actualTypeArgument) ;
}
}
}
System . out. println ( "______________________" ) ;
method = Test10 . class . getMethod ( "test2" ) ;
Type geericReturnType = method. getGenericReturnType ( ) ;
if ( geericReturnType instanceof ParameterizedType ) {
Type [ ] actualTypeArguments = ( ( ParameterizedType ) geericReturnType) . getActualTypeArguments ( ) ;
for ( Type actualTypeArgument : actualTypeArguments) {
System . out. println ( actualTypeArgument) ;
}
}
}
}
五、反射操作注解
package com. cty. reflection ;
import java. lang. annotation. * ;
import java. lang. reflect. Field ;
public class Test11 {
public static void main ( String [ ] args) throws ClassNotFoundException , NoSuchFieldException {
Class c1 = Class . forName ( "com.cty.reflection.Student2" ) ;
Annotation [ ] annotations = c1. getAnnotations ( ) ;
for ( Annotation annotation : annotations) {
System . out. println ( annotation) ;
}
TableCty tableCty = ( TableCty ) c1. getAnnotation ( TableCty . class ) ;
System . out. println ( tableCty. value ( ) ) ;
Field f = c1. getDeclaredField ( "name" ) ;
FieldCty annotation = f. getAnnotation ( FieldCty . class ) ;
System . out. println ( annotation. columnName ( ) ) ;
System . out. println ( annotation. type ( ) ) ;
System . out. println ( annotation. length ( ) ) ;
}
}
@TableCty ( "db_student" )
class Student2 {
@FieldCty ( columnName = "da_id" , type = "int" , length = 10 )
private int id;
@FieldCty ( columnName = "da_age" , type = "int" , length = 10 )
private int age;
@FieldCty ( columnName = "da_name" , type = "varchar" , length = 3 )
private String 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;
}
public Student2 ( int id, int age, String name) {
this . id = id;
this . age = age;
this . name = name;
}
@Override
public String toString ( ) {
return "Student2{" +
"id=" + id +
", age=" + age +
", name='" + name + '\'' +
'}' ;
}
public Student2 ( ) {
}
}
@Target ( ElementType . TYPE)
@Retention ( RetentionPolicy . RUNTIME)
@interface TableCty {
String value ( ) ;
}
@Target ( ElementType . FIELD)
@Retention ( RetentionPolicy . RUNTIME)
@interface FieldCty {
String columnName ( ) ;
String type ( ) ;
int length ( ) ;
}