Java机制---反射
反射使用的前提:该类必须加载到jvm中,并生成对应的class文件(字节码)
只有这样才能通过反射来动态获取加载这个类
- 首先了解一下jvm(java的虚拟机),Java之所以可以跨平台就是因为它,也可以理解成一个
- 进程,一个程序,只不过它的主要用途是为了跑你的Java代码来用的。
jvm的组成是由一个方法区,一个堆,一个栈组成的。
举个例子,当你写一段代码Persion o=new Persion ();
- 启动程序,首先jvm会先启动,并把你的代码编译成class文件,然后被类加载器(Class Loader)加载到内存中,你的类Persion就会加载到方法区中,而你创建的对象o就会到堆中,注意这个不是new出来的对象,而是类的类型对象,每个类只有一个class对象,作为方法区类的数据结构的接口。jvm创建对象前,会先检查类是否加载,寻找类对应的class对象,若加载好,则为你的对象分配内存,初始化也就是代码:new Persion ()。
- 反射是什么,就是当我们的程序在运行时,需要动态的加载一些类(可能之前用不到所以不用加载到jvm的类),而是在运行时根据需要才加载,这样的好处对于服务器来说不言而喻。
练习:
- /**
- * Method方法反射
- * **/
准备:
(1)、
package com.ljz.api;
public interface TestUtil {
public void test(int i);
}
(2)、
package com.ljz;
import com.ljz.api.TestUtil;
public class test implements TestUtil{
@Override
public void test(int i) {
// TODO Auto-generated method stub
System.out.println("test.test()-----------"+i+"-------------------------");
}
}
测试:
public static void main(String[] args) {
try {
Class c = Class.forName("com.ljz.test");
Object obj = c.newInstance();
/**
* getDeclaredMethod(方法名,参数)
*
* **/
Method method = c.getDeclaredMethod("test",int.class);
//通过反射调用Test类中的say方法
method.invoke(obj, 13);
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
- /**
- * 非Method方法反射
- * **/
准备:
(1)、
package com.fs.api;
public interface Baseaction {
public void executeCheck();
}
(2)、
package com.fs.model;
import com.fs.api.Base;
import com.fs.api.Baseaction;
public class T_1 implements Baseaction{
@Override
public void executeCheck() {
// TODO Auto-generated method stub
System.out.println("---------------------------T1-------------------------");
//添加日志
}
}
(3)、
package com.fs.model;
import com.fs.api.Base;
import com.fs.api.Baseaction;
public class T_2 implements Baseaction{
@Override
public void executeCheck() {
// TODO Auto-generated method stub
System.out.println("---------------------------T2-------------------------");
//添加日志
}
}
测试:
public static void main(String[] args) {
try {
Baseaction base = ((Baseaction)Class.forName("com.fs.model.T_1").newInstance());
base.executeCheck();
Thread.sleep(1000);
Baseaction base = ((Baseaction)Class.forName("com.fs.model.T_2").newInstance());
base.executeCheck();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
本文深入解析Java反射机制,探讨其工作原理及应用场景。反射允许程序在运行时动态加载类,适用于服务器环境中按需加载类的需求。文章通过实例演示了如何使用反射调用方法和创建对象。
4万+

被折叠的 条评论
为什么被折叠?



