1.类的加载器
package com.cl.reflection;
import sun.reflect.generics.scope.ClassScope;
//类的加载器
public class Test07 {
public static void main(String[] args) throws ClassNotFoundException {
//获取系统类的加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
System.out.println(systemClassLoader);
//获取系统类加载器的父类加载器->扩展类加载器
ClassLoader parent = systemClassLoader.getParent();
System.out.println(parent);
//获取扩展类加载器的父类加载器-->根加载器(c/++)
ClassLoader parent1 = parent.getParent();
System.out.println(parent1);//null,因为跟加载器是Java类库的核心类库的,不可以直接获取
//测试当前类是那个加载器加载的
ClassLoader classLoader = Class.forName("com.cl.reflection.Test07").getClassLoader();
System.out.println(classLoader);
//测试JDK内置的类是谁加载
classLoader = Class.forName("java.lang.Object").getClassLoader();
System.out.println(classLoader);
//如何获得系统类加载器可以加载的路径
System.out.println(System.getProperty("java.class.path"));
/*
D:\java\jdk8\jre\lib\charsets.jar;
D:\java\jdk8\jre\lib\deploy.jar;
D:\java\jdk8\jre\lib\ext\access-bridge-64.jar;
D:\java\jdk8\jre\lib\ext\cldrdata.jar;
D:\java\jdk8\jre\lib\ext\dnsns.jar;
D:\java\jdk8\jre\lib\ext\jaccess.jar;
D:\java\jdk8\jre\lib\ext\jfxrt.jar;
D:\java\jdk8\jre\lib\ext\localedata.jar;
D:\java\jdk8\jre\lib\ext\nashorn.jar;
D:\java\jdk8\jre\lib\ext\sunec.jar;
D:\java\jdk8\jre\lib\ext\sunjce_provider.jar;
D:\java\jdk8\jre\lib\ext\sunmscapi.jar;
D:\java\jdk8\jre\lib\ext\sunpkcs11.jar;
D:\java\jdk8\jre\lib\ext\zipfs.jar;
D:\java\jdk8\jre\lib\javaws.jar;
D:\java\jdk8\jre\lib\jce.jar;
D:\java\jdk8\jre\lib\jfr.jar;
D:\java\jdk8\jre\lib\jfxswt.jar;
D:\java\jdk8\jre\lib\jsse.jar;
D:\java\jdk8\jre\lib\management-agent.jar;
D:\java\jdk8\jre\lib\plugin.jar;
D:\java\jdk8\jre\lib\resources.jar;
D:\java\jdk8\jre\lib\rt.jar;
D:\Java笔记\注解和 反射\out\production\注解和 反射;
C:\Program Files\JetBrains\IntelliJ IDEA 2019.2.4\lib\idea_rt.jar
* */
}
}
2.获取类的信息
package com.cl.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
//获取类的信息
public class Test08 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
Class c1= Class.forName("com.cl.reflection.User");
User user=new User();
c1=user.getClass();
//获得类的名字
System.out.println(c1.getName());//获得类名加包名
System.out.println(c1.getSimpleName());//获得类名
//获得类的属性
System.out.println("==========================");
Field[] fields=c1.getFields();//只能找到public属性
fields = c1.getDeclaredFields();//找到全部属性
for (Field field : fields) {
System.out.println(field);
}
//获得指定属性的值
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("getDeclareMethods:"+method);
}
//获得指定方法
//重载
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("s"+constructor);
}
//获得指定构造器
Constructor declaredConstructor = c1.getDeclaredConstructor(String.class, int.class, int.class);
System.out.println("指定"+declaredConstructor);
}
}
/*
小结:1.在实际操作中,取得类的信息的操作代码,并不会经常开发
2.但一定要熟悉java.lang.reflect包的作用,反射机制
3.如何取得属性,方法,构造器的名称,修饰符等
* */
动态创建对象,通过反射
package com.cl.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
//动态创建对象,通过反射
public class Test09 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
//获得class对象
Class c1=Class.forName("com.cl.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("king",001,18);
System.out.println(user2);
//通过反射调用普通方法
User user3=(User)c1.newInstance();
//通过反射获取一个方法
Method setName=c1.getDeclaredMethod("setName",String.class);
//invoke激活
//(对象,"方法的值")
setName.invoke(user3,"king");
System.out.println(user3.getName());
}
}
/*
//实体类:pojo,entity
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;
}
* */
**分析性能问题,通过普通方式调用,反射方式调用,关闭检测的反射调用
package com.cl.reflection;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
//分析性能问题
public class Test10 {
//普通方式调用
public static void test01(){
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 test02() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
User user = new User();
Class c1= user.getClass();
Method getName = c1.getMethod("getName", null);
long startTime=System.currentTimeMillis();
for (int i = 0; i < 1000000000; 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.getMethod("getName", null);
getName.setAccessible(true);//设置权限检查为true,就是关闭
long startTime=System.currentTimeMillis();
for (int i = 0; i < 1000000000; 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();//5ms
test02();//2256ms
test03();//1048ms
/*
总结;1.普通方式调用类中方法所需时间要远远小于利用反射调用
2.到项目中的反射调用很多时,可以尝试关闭检测,用来提高效率
* */
}
}
***练习反射操作注解
package com.cl.reflection;
import java.lang.annotation.*;
import java.lang.reflect.Field;
//练习反射操作注解
public class Text12 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
Class c1 = Class.forName("com.cl.reflection.Student2");
//通过反射获得注解
Annotation[] annotations = c1.getAnnotations();
for (Annotation annotation : annotations) {
System.out.println(annotation);
}
//获得注解的value的值
TableKing tableKing = (TableKing)c1.getAnnotation(TableKing.class);
String value = tableKing.value();
System.out.println(value);
//获得类指定的注解
Field f = c1.getDeclaredField("name");
FieldKing annotation = f.getAnnotation(FieldKing.class);
System.out.println(annotation.columnName());
System.out.println(annotation.type());
System.out.println(annotation.length());
}
}
@TableKing("db_student")
class Student2{
@FieldKing(columnName = "db_id",type="int",length = 10)
private int id;
@FieldKing(columnName = "db_age",type="int",length = 10)
private int age;
@FieldKing(columnName = "db_name",type="int",length = 3)
private String name;
public Student2() {
}
public Student2(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 "Student2{" +
"id=" + id +
", age=" + age +
", name='" + name + '\'' +
'}';
}
}
//类名的注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface TableKing{
String value();
}
//属性的注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface FieldKing{
String columnName();
String type();
int length();
}