Java的反射机制

Java的反射机制

参考:https://blog.csdn.net/z2012c/article/details/84897148?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

基本定义:
(1)对于任意一个类,都能知道该类的所有属性和方法;
(2)对于任意一个对象,都能调用该对象的任意一个属性和方法。

常用方式:
(1)获取Class对象;
(2)实例化一个对象;
(3)获取一个类的父类或者接口(单继承,多实现);
(4)获取类中的所有属性;
(5)获取类中的所有方法;
(6)调用类中的任意一个方法。

更进一步理解,可参看下面的Java代码:

package reflect_test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;

interface Animal 
{
    public abstract void eatFood();
}

class Monkey implements Animal 
{
    public void eatFood() 
    {
        System.out.println("monkey eat peach ...");
    }
}

class Person extends Monkey implements Animal
{
    public int name;
    public int age;
    public Person(int name,int age)
    {
        this.name = name;
        this.age = age;
    }
}

class Panda implements Animal 
{
    public void eatFood() 
    {
        System.out.println("Panda eat bamboo ...");
    }
}

class Factory 
{
    public static Animal getInstance(String ClassName) 
    {
        Animal animal = null;

        try 
        {
         animal = (Animal) Class.forName(ClassName).newInstance();
        } 
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return animal;
    }
}

public class ReflectTest 
{
    public static void main(String[] args) throws Exception
    {
        /*
         Java语言的反射机制:
         对于任意一个类,都能知道该类的属性和方法;
         对于任意一个对象,都能调用该对象的任意一个属性和方法
         */

    	//=====================================================================================
         //1.获取Class对象
         Class class1 = Class.forName("reflect_test.Monkey");//参数为该类的全限定名(包名.类名)
         System.out.println("类名称 :" + class1.getName());//返回该类的全限定名

         Class class2 = new Monkey().getClass();
         System.out.println("类名称 :" + class2.getName());//返回该类的全限定名

         Class class3 = Monkey.class;
         System.out.println("类名称 :" + class3.getName());//返回该类的全限定名

         //=====================================================================================
        //2.实例化一个类对象
        Monkey m1 = (Monkey)class1.newInstance();//newInstance()方法
        //构造函数法
        Constructor[] cons = class1.getConstructors();
        Monkey m2 = (Monkey)cons[0].newInstanc

  	//=====================================================================================
        //3.获取父类或者接口(单继承多实现)
        Class class4 = Class.forName("reflect_test.Person");//获取Class对象,参数为全限定类名(包名.类名)
        Class superClass = class4.getSuperclass();//获取父类Class对象
        System.out.println("父类为:" + superClass.getName());

        

        Class[] in = class4.getInterfaces();
        for(int i = 0;i < in.length;i++)
        {
           System.out.println("实现的接口为:" + in[i].getName());
        }
      
       //=====================================================================================
        //4.获取一个类的全部属性
        Field[] field = class4.getDeclaredFields();
        for(int i = 0;i < field.length;i++)
        {
           //获取属性的权限修饰符
           int mo = field[i].getModifiers();
           System.out.println(Modifier.toString(mo));

           //获取属性的类型
           Class type = field[i].getType();
           System.out.println("该属性的类型为:" + type.getName() + ",该属性名称为: " + field[i].getName());
        }

	//=====================================================================================
        //5.获取一个类的全部方法
        Method[] method = class4.getMethods();
        for(int i = 0;i < method.length;i++)
        {
           //该方法的修饰符
           String md = Modifier.toString(method[i].getModifiers());
           System.out.println("方法的修饰符" + md);

           //该方法函数返回值类型
           Class rt = method[i].getReturnType();
           System.out.println("函数返回值类型" + rt.getName());

           //方法参数
           Parameter[] p = method[i].getParameters();
        }

    	//=====================================================================================
        //6.调用某个类的方法
        Class class5 = Class.forName("reflect_test.Monkey");
        Method me = class5.getMethod("eatFood", null);
        me.invoke(class5.newInstance(), null);

     	//=====================================================================================
        Animal animal = Factory.getInstance("reflect_test.Panda");

        if (animal != null) 
        {
           animal.eatFood();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值