getMethods getDeclaredMethods区别

本文深入探讨了Java反射机制中getMethods()与getDeclaredMethods()的区别,通过具体示例对比了这两种方法在获取类方法时的不同行为,特别是对于继承和私有方法的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人理解如下:
public Method[] getMethods()返回某个类的所有公用(public)方法包括其继承类的公用方法,当然也包括它所实现接口的方法。
public Method[] getDeclaredMethods()返回自身类的所有公用(public)方法包括私有(private)方法,但包括其继承类的方法,当然也包括它所实现接口的方法。
如下:

package zhuhaifeng.pojo;


public interface IEngine {
        /**
         * 引擎的马力
         * @return
         */

        public int getPower();

}
Car类实现该接口
package zhuhaifeng.pojo;


public class Car implements IEngine {
        private String driver;


        protected String brand;
        protected String color;
        protected int maxSpeed;

        public Car() {
                System.out.println("Car 的默认构造函数正在运行。。。");
        }

        /**
         * 汽车介绍
         */

        public void introduce() {
                System.out.println(" the brand is :" + brand + "\n the color is : " + color + "\n the maxSpeed is :" + maxSpeed);
        }

        public int getPower() {
                return 10;
        }

        public String getBrand() {
                return brand;
        }

        public void setBrand(String brand) {
                this.brand = brand;
        }

        public String getColor() {
                return color;
        }

        public void setColor(String color) {
                this.color = color;
        }

        public int getMaxSpeed() {
                return maxSpeed;
        }

        public void setMaxSpeed(int maxSpeed) {
                this.maxSpeed = maxSpeed;
        }

       
        private String getDriver() {
                return driver;
        }

        private void setDriver(String driver) {
                this.driver = driver;
        }
}
//其中getDriver,setDriver是私有的.
Truck继承Car类
package zhuhaifeng.pojo;

import zhuhaifeng.pojo.Car;


public class Truck extends Car {
        private String capacity;    //载重
                                private String driver;
        public void setCapacity(String capacity) {
                this.capacity = capacity;
        }

        public Truck(){
                System.out.println("Truck 的默认构造函数正在运行。。。");
        }

        /**
         *    汽车介绍
         */

        public void introduce(){
                        System.out.println("Truck    :");
                        System.out.println(" the brand is :"+brand+ "\n the color is : "+color+"\n the maxSpeed is :"+maxSpeed);
        }


        public int getPower() {
                return 100;    //To change body of implemented methods use File | Settings | File Templates.
        }
            private String getDriver() {
                return driver;
        }

        private void setDriver(String driver) {
                this.driver = driver;
        }
}
最后还有:
package zhuhaifeng.reflect;

import zhuhaifeng.pojo.Truck;

import java.lang.reflect.Method;

public class MethodsDifferent {
        public static void displayMethods(Class clazz) throws Throwable {

                System.out.println("\ngetMethods方法: ");
                Method[] methods = clazz.getMethods();
                for (int i = 0; i < methods.length; i++) {
                        Method method = methods[i];
                        System.out.println("方法名称 " + method.getName());
                        //    System.out.println("param type " + method.getParameterTypes().toString());

                }

        }

        public static void displayDeclaredMethods(Class clazz) throws Throwable {
                System.out.println("\ngetDeclaredMethods方法: ");
                Method[] methods = clazz.getDeclaredMethods();
                for (int i = 0; i < methods.length; i++) {
                        Method method = methods[i];
                        System.out.println("方法名称 " + method.getName());
                        //    System.out.println("param type " + method.getParameterTypes().toString());

                }

        }

        public static void main(String[] args) throws Throwable {
                Class clazz = ReflectDemo.loadClass("zhuhaifeng.pojo.Truck");
                Truck truck = (Truck) ReflectDemo.initDefaultConstructor(clazz);
 
                displayDeclaredMethods(clazz);
                displayMethods(clazz);

        }


}
运行结果如下:

Car 的默认构造函数正在运行。。。
Truck 的默认构造函数正在运行。。。

getDeclaredMethods方法(只显示当前类的方法,但包括私有方法): 
方法名称 introduce
方法名称 setCapacity
方法名称 getPower
方法名称 getDriver
方法名称 setDriver

getMethods方法(显示其继承类的方法,但不包括私有方法getDriver): 
方法名称 introduce
方法名称 setCapacity
方法名称 getPower
方法名称 setBrand
方法名称 setMaxSpeed
方法名称 getBrand
方法名称 getMaxSpeed
方法名称 setColor
方法名称 getColor
方法名称 hashCode
方法名称 getClass
方法名称 wait
方法名称 wait
方法名称 wait
方法名称 equals
方法名称 toString
方法名称 notify
方法名称 notifyAll

Process finished with exit code 0
其他相关类:
package zhuhaifeng.reflect;

import zhuhaifeng.pojo.Car;
import zhuhaifeng.pojo.Truck;

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

/**
* Created by IntelliJ IDEA.
* User: zhuhaifeng
* Date: 2008-10-18
* Time: 20:02:21
* To change this template use File | Settings | File Templates.
*/

public class ReflectDemo {

        /**
         * 通过类装载器装载类
         *
         * @param className
         * @return
         * @throws Throwable
         */

        public static Class loadClass(String className) throws Throwable {
                //类装载器
                ClassLoader loader = Thread.currentThread().getContextClassLoader();
                Class clazz = loader.loadClass(className);
                return clazz;

        }

        /**
         * 通过初始化默认构造函数实例化对象
         *
         * @param clazz
         * @return
         * @throws Throwable
         */

        public static Object initDefaultConstructor(Class clazz) throws Throwable {


                //    获取类的默认构造器对象并通过它实例化Car
                Constructor cons = clazz.getDeclaredConstructor((Class[]) null);
                return cons.newInstance();


        }

        /**
         * 初始化方法参数
         *
         * @param clazz
         * @param obj
         * @param methodName
         * @param methodParam
         * @throws Throwable
         */

        public static void initMethodParam(Class clazz, Object obj, String methodName, Object methodParam) throws Throwable {

                Method[] methods = clazz.getMethods();
                //遍历方法
                for (int i = 0; i < methods.length; i++) {
                        Method method = methods[i];
                        //判断方法名称是否相同
                        if (method.getName().equals(methodName)) {

                                method.invoke(obj, methodParam);
                        }

                }


        }


        public static void main(String[] args) throws Throwable {
                Class clazz = loadClass("zhuhaifeng.pojo.Truck");
                Truck truck = (Truck) initDefaultConstructor(clazz);
                initMethodParam(clazz, truck, "setBrand""奥迪A6");
                initMethodParam(clazz, truck, "setMaxSpeed", 30);
                // displayMethod( clazz)         ;

                truck.introduce();
        }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值