通过类的全限定名找到存储在硬盘的.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()); } } }