类加载过程

类的加载过程:

通过类的全限定名找到存储在硬盘的.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());
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值