getMethods getDeclaredMethods区别

来源:互联网 发布:有深度的动漫 知乎 编辑:程序博客网 时间:2024/06/10 08:46
个人理解如下:
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();
        }
}
0 0
原创粉丝点击