类的加载过程:
通过类的全限定名找到存储在硬盘的.class文件
通过二进制字节流将文件加载到内存并存放在jvm方法去中
通过反射动态生成Class对象在堆区中
对象中的构造方法放在堆中,变量等存放在栈区指向堆
mybatis和SpringMVC都是运用了反射的原理
反射
参考博客:java反射(特别通俗易懂)
反射的概念:
java反射机制是在运行机制中对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取信息及动态调用对象的方法的功能称为java语言的反射机制
通过反射获取class对象的三种方式
- Object-+getClass();
例:
Student stu=new Student(); class stuClass=stu.getClass();
- 任何数据类型都有一个静态的class属性
例:
Class stuClass=Student.class;
- 通过Class类的静态方法:
例:
try{ Class stuClass=Class.forName("fanshe.Student");//其中字符串要写真实路径包加类名 }catch (ClassNotFoundException e) { e.printStackTrace(); }
一般常用第三种方法
反射的例子:
package Test_Fanshe;
import java.lang.reflect.Method;
public class Fanshe_GetMethod {
public static void main(String[] args) {
String s="hello";
Fanshe_GetMethod.printClassMethodMessage(s);
Integer n1=1;
Fanshe_GetMethod.printClassMethodMessage(n1);
}
private static void printClassMethodMessage(Object obj){
Class c=obj.getClass();//获取类的类类型
System.out.println(obj+"类的名称是"+c.getName());
/*
Method类,方法对象
一个成员方法就是一个Method对象
getMethod()方法获取的是所有的public的函数,包括父类继承而来的
getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限
*/
Method[] ms=c.getMethods();//获取所有类自己声明的方法
System.out.println(obj+"返回值类型的类类型"+"+"+"方法的名称"+"+"+"参数列表类型的类类型");
for (Method m : ms) {
//得到方法的返回值类型的类类型
Class returnType = m.getReturnType();
System.out.print(returnType.getName() + " ");
//得到方法的名称
System.out.print(m.getName() + "(");
//获取参数列表的类型的类类型
Class[] paramTypes = m.getParameterTypes();
for (Class class1 : paramTypes) {
System.out.print(class1.getName() + ",");
}
System.out.println(")");
}
}
}
反射调用的方法:
package Test_Fanshe;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Fanshe_diaoyong {
public static void main(String[] args) {
A a1=new A();
Class c=a1.getClass();//获取类的类类型
try{
Method m=c.getMethod("print",int.class,int.class);
//方法的反射操作
Object o=m.invoke(a1,10,20);
System.out.println("===============");
Method m1=c.getMethod("print", String.class, String.class);
o=m1.invoke(a1,"hello","World");
System.out.println("===============");
Method m2=c.getMethod("print");
m2.invoke(a1);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
static class A{
public void print(){
System.out.println("hello world");
}
public void print(int a,int b){
System.out.println(a+b);
}
public void print(String a,String b){
System.out.println(a.toUpperCase()+","+b.toUpperCase());
}
}
}