Java基础之反射

本文介绍了Java反射机制,它是Java语言的一项重要特性,允许在运行时动态获取类的信息并调用其方法。通过字节码文件对象,可以访问类的构造方法、成员变量和成员方法。文章通过实例演示了如何通过反射创建对象、调用构造函数、获取并使用成员变量和方法。
摘要由CSDN通过智能技术生成


概述

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

    动态获取类中信息,就是java反射。可以理解为对类的解剖。
    如果想要对指定名称的字节码文件进行加载并获取其中的内容并调用,这时就使用到了反射技术。


(1)类的加载及类加载器


(2)反射:

通过字节码文件对象,去使用成员变量,构造方法,成员方法


(3)反射的使用

A:通过反射获取构造方法并使用

代码:

import cn.itcast.bean.Person;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class ReflectDemo
{
        public static void main(String[] args) throws Exception {
                createNewObject_1();
                System.out.println("--------------------");
                createNewObject_2();
        }

        public static void createNewObject_1() throws ClassNotFoundException,InstantiationException,IllegalAccessException {
                //早期:new时候,先根据被new的类的名称找寻该类的字节码文件,并加载进内存,
                //并创建该字节码文件对象,并接着创建该字节文件的对应的Person对象。
                //Person p = new Person();

                //现在:
                String name = "cn.itcast.bean.Person";
                //找寻该文件类文件,并加载进内存,并产生Class对象。
                Class clazz = Class.forName(name);
                //如何产生该类的对象呢?
                Object obj = clazz.newInstance();//调用Person的空参构造函数
        }

        public static void createNewObject_2() throws ClassNotFoundException,InstantiationException,NoSuchMethodException,IllegalAccessException,InvocationTargetException {

                //Person p = new Person("小强",39);

                /*
                * 当获取指定名称对应类中的所体现的对象时。
                * 而该对象初始化不使用空参数构造函数该怎么办呢?
                * 既然是通过指定的构造函数进行对象的初始化。
                * 所以应该先获取到该构造函数,通过字节码文件对象即可完成。
                * 该方法是:getConstructor(parameterTypes);
                */

                String name = "cn.itcast.bean.Person";
                //找寻该名称类文件,并加载进内存,并产生Class对象。
                Class clazz = Class.forName(name);
                //获取到了指定的构造函数对象
                Constructor constructor = clazz.getConstructor(int.class,String.class);
                //通过该构造器对象的newInstance方法进行对象的初始化。
                Object obj = constructor.newInstance(38,"小明");
        }
}

B:通过反射获取成员变量并使用


C:通过反射获取成员方法并使用

代码:

import cn.itcast.bean.Person;
import java.lang.reflect.Method;
import java.lang.reflect.Constructor;

public class ReflectDemo
{
        public static void main(String[] args) throws Exception {
                getMethodDemo_1();
                System.out.println("---------------------------");
                getMethodDemo_2();
                System.out.println("---------------------------");
                getMethodDemo_3();
        }
        
        /*
        * 获取指定Class中的公共函数。
        */
        public static void getMethodDemo_1() throws Exception {

                Class clazz = Class.forName("cn.itcast.bean.Person");
                
                Method[] methods = clazz.getMethods();//获取的都是公有的方

                methods = clazz.getDeclaredMethods();//只获取本类中所有方法,包括私有。

                for(Method method : methods){
                        System.out.println(method);
                }
        }

        public static void getMethodDemo_2() throws Exception {

                Class clazz = Class.forName("cn.itcast.bean.Person");
                
                Method method = clazz.getMethod("show",null);//获取空参数一般方法

                Object obj = clazz.newInstance();

                Constructor constructor = clazz.getConstructor(int.class,String.class);
                obj = constructor.newInstance(37,"小明");

                method.invoke(obj,null);
        }

        public static void getMethodDemo_3() throws Exception {

                Class clazz = Class.forName("cn.itcast.bean.Person");
                
                Method method = clazz.getMethod("paramMethod",String.class,int.class);//获取空参数一般方法

                Object obj = clazz.newInstance();

                Constructor constructor = clazz.getConstructor();
                obj = constructor.newInstance();

                method.invoke(obj,"小强",89);
        }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值