Java 的反射 简单了解

一, Java反射是在动态的获取类, 类属性, 类方法, 类构造方法等内部一些类的信息。
目的是为了让代码效率更高,更具有普适性!

例:以下为简单的创建一个对象: 

1.获取三种方式
    Class.forName("包名+ 类名");
    类.class
    对象.getClass()
2.获取构造方法对象
    class对象.getConstructor();
    construct对象.newInstance();根据构造方法实例化对象
3.获取方法对象
    class对象.getMethod(String name, Class<?> ...parameterType);
    method对象.invoke(Object obj, Object... initargs); 

package com.xcl_Q;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

class Pig {
    String name;
    int age;
    public Pig(){

    }
    public  Pig(String name){
        this.name = name;
    }
    private  Pig (String name,int age){

    }
    public void eat(){
        System.out.println("吃大盘鸡拌面!");
    }
    private void eat(String name){
        System.out.println("吃大盘鸡拌面!");
        this.name = name;

    }
}
public class Demo4 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //获取一个类对象的三种方式

        //第一步为:获取class对象

        //1, 首先获取class对象(包含了类里面的所有信息)
        Class<Pig> pigClass = Pig.class;
        System.out.println("第一种class类对象声明方式:" + pigClass);
        //2, 获取class对象的第二种方式(以类权限命名)(包含了类里面的所有信息)
        Class<?> aClass = Class.forName("com.xcl_Q.Pig");
        System.out.println("第二种class类对象声明方式:" +aClass);
        //3, 获取class对象的第三种方式(包含了类里面的所有信息)
        Class<? extends Pig> aClass1 = new Pig().getClass();
        System.out.println("第三种class类对象声明方式:" +aClass1);

        //第二步为:通过class类对象来获取构造方法

        System.out.println("constructor==============1");
       // 以下是获取Constructor的构造方法对象
        Constructor<Pig> constructor = pigClass.getConstructor();
            System.out.println("得到一个构造方法"+constructor);

            System.out.println("getConstructors=================2");

        Constructor<?>[] constructors = pigClass.getConstructors();
            for (Constructor<?> constructor1 : constructors) {
            System.out.println("将每一个构造方法遍历出来:"+constructor1);}

            System.out.println("getDeclaredConstructors===============3");

        Constructor<?>[] declaredConstructors = pigClass.getDeclaredConstructors();
            for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
            }
            System.out.println("getDeclaredConstructor=============4");

       Constructor<Pig> declaredConstructor = pigClass.getDeclaredConstructor();
            for (Constructor<?> declaredConstructor1 : declaredConstructors) {
                System.out.println(declaredConstructor1);
            }
        //第三步为: 创建对象!
        Pig pig = constructor.newInstance();

        //下面为获取方法的简单介绍:
        System.out.println("获取类的所有方法:(包含了父类所有的可以继承的方法)");
        Method[] methods = pigClass.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        //获取本类的方法:
        Class<Pig> pigClass1 = Pig.class;//首先先创建一个class对象
        Pig pig1 = pigClass1.newInstance();//通过class对象来实例化一个对象
        System.out.println("首先通过类对象来获取方法========下面为无参构造");
        Method eat = pigClass1.getMethod("eat",null);
        eat.invoke(pig1,null);//传的参数为实例化对象 (这个方法为无参构造方法)

        System.out.println("下面为有参构造==========");
        //首先创建方法对象
        Method eat1 = pigClass1.getDeclaredMethod("eat",null);
        eat1.setAccessible(true);//用方法对象来暴力反射私有化的方法
        eat1.invoke(pig1,null);//然后用方法对象来执行方法就可以了
        /**
         * 一 总结:
         * 1, getMethod (string name , class<?> ... parameterType)
         * (。2)如果为有参构造的话 Method eat1 = pigClass1.getDeclaredMethod("eat",null);
         * 那么getDeclaredMethod("方法名字",null(数据类型.class))私有化的方法可以暴力反射setAccible(true)来进行,然后用
         * 方法来自己执行方法
         * (·1)如果为无参构造的话Method eat = pigClass1.getMethod("方法名字",null);
         */







    }
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值