-
获得反射对象
package com.java.reflection;
public class Test01 {
public static void main(String[] args) throws ClassNotFoundException {
Class c1=Class.forName("com.java.reflection.User");
System.out.println(c1);
Class c2=Class.forName("com.java.reflection.User");
Class c3=Class.forName("com.java.reflection.User");
Class c4=Class.forName("com.java.reflection.User");
System.out.println(c2.hashCode());
System.out.println(c3.hashCode());
System.out.println(c4.hashCode());
}
}
class User{
private String name;
private int age;
private int id;
public User() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", id=" + id +
'}';
}
}
-
Class类的创建方式
package com.java.reflection;
public class Test02 {
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.java.reflection.Student");
System.out.println(c2.hashCode());
Class<Student> 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() {
}
public Person(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
}
class Student extends Person{
public Student(){
this.name="学生";
}
}
class Teacher extends Person{
public Teacher(){
this.name="老师";
}
}
-
所有类型的Class类
package com.java.reflection;
import java.lang.annotation.ElementType;
public class Test03 {
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());
}
}
-
类的加载
package com.java.reflection;
public class Test04 {
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类无参构造初始化");
}
}
-
类发生初始化的时间
package com.java.reflection;
public class Test05 {
static{
System.out.println("Main类被加载");
}
public static void main(String[] args) throws ClassNotFoundException {
System.out.println(Son.B);
}
}
class Father{
static int a=1;
static{
System.out.println("父类被加载");
}
}
class Son extends Father{
static int b=10;
static final int B=200;
static{
System.out.println("子类被加载");
b=100;
}
}
-
类加载器
package com.java.reflection;
public class Test06 {
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 parent2=parent.getParent();
System.out.println(parent2);
ClassLoader classLoader1=Class.forName("com.java.reflection.Test06").getClassLoader();
System.out.println(classLoader1);
classLoader1=Class.forName("java.lang.Object").getClassLoader();
System.out.println(classLoader1);
System.out.println(System.getProperty("java.class.path"));
}
}
-
获取类的运行时结构
package com.java.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test07 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
Class c1=Class.forName("com.java.reflection.User");
System.out.println(c1.getName());
System.out.println(c1.getSimpleName());
System.out.println("-----------------------");
Field[] fields=c1.getFields();
for(Field field:fields){
System.out.println(field);
}
System.out.println("-----------------------");
Field[] fields02=c1.getDeclaredFields();
for(Field field:fields02){
System.out.println(field);
}
System.out.println("-----------------------");
Field field=c1.getDeclaredField("name");
System.out.println(field);
System.out.println("-----------------------");
Method[] methods=c1.getMethods();
for (Method method:methods) {
System.out.println("getMethods的方法:"+method);
}
Method[] methods02=c1.getDeclaredMethods();
for (Method method:methods02) {
System.out.println("getDeclaredMethods的方法:"+method);
}
System.out.println("-----------------------");
Method getName=c1.getDeclaredMethod("getName", null);
Method setName=c1.getDeclaredMethod("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);
}
Constructor[] constructors02=c1.getDeclaredConstructors();
for (Constructor constructor:constructors02) {
System.out.println("***-->"+constructor);
}
System.out.println("-----------------------");
Constructor constructor03=c1.getDeclaredConstructor(String.class, int.class, i
nt.class);
System.out.println(constructor03);
}
}
-
动态创建对象执行方
package com.java.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test08 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
Class c1=Class.forName("com.java.reflection.User");
System.out.print("构造一个对象:");
User user=(User) c1.newInstance();
System.out.println(user);
System.out.print("通过构造器创建对象:");
Constructor constructor=c1.getDeclaredConstructor(String.class,int.class,int.class);
User user1=(User) constructor.newInstance("xuexi",002,23);
System.out.println(user1);
System.out.print("反射调用普通方法:");
User user2=(User) c1.newInstance();
Method setName=c1.getDeclaredMethod("setName", String.class);
setName.invoke(user2,"芝士");
System.out.println(user2.getName());
System.out.print("反射获取属性:");
User user3=(User) c1.newInstance();
Field name = c1.getDeclaredField("name");
name.setAccessible(true);
name.set(user3,"圣灵");
System.out.println(user3.getName());
}
}
-
性能对比分析
package com.java.reflection;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test09 {
public static void test01(){
User user=new User();
long startTime=System.currentTimeMillis();
for (int i = 0; i < 10_0000_0000; 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 < 10_0000_0000; 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 < 10_0000_0000; 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 com.java.reflection;
import java.lang.reflect.MalformedParametersException;
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 test01(Map<String,User> map, List<User> list){
System.out.println("test01");
}
public Map<String,User> test02(){
System.out.println("test02");
return null;
}
public static void main(String[] args) throws NoSuchMethodException {
Method method=Test10.class.getMethod("test01", 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("test02",null);
Type genericReturnType = method.getGenericReturnType();
if(genericReturnType instanceof ParameterizedType){
Type[] actualTypeArguments=((ParameterizedType) genericReturnType).getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println(actualTypeArgument);
}
}
}
}
-
获取注解信息
package com.java.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.java.reflection.Student01");
Annotation[] annotations = c1.getAnnotations();
for (Annotation annotation:annotations) {
System.out.println(annotation);
}
TableName tableName=(TableName) c1.getAnnotation(TableName.class);
String value = tableName.value();
System.out.println(value);
Field f=c1.getDeclaredField("name");
FieldInterface annotation=f.getAnnotation(FieldInterface.class);
System.out.println(annotation.colName());
System.out.println(annotation.type());
System.out.println(annotation.length());
}
}
@TableName("db-student01")
class Student01{
@FieldInterface(colName = "db-name",type = "varchar",length = 20)
private String name;
@FieldInterface(colName = "db-id",type = "int",length = 10)
private int id;
@FieldInterface(colName = "db-age",type = "int",length = 10)
private int age;
public Student01() {
}
public Student01(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 "student{" +
"name='" + name + '\'' +
", id=" + id +
", age=" + age +
'}';
}
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface TableName{
String value();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface FieldInterface{
String colName();
String type();
int length();
}