Java Method 类

目录

  • Method
    • 1. 获得方法对象
    • 2. 主要方法
    • 3. Java 实例


Method

  • 使用 Java 的反射机制获得的指定类中指定方法的对象;
  • Method 类的对象可以是类方法,也可以是实例方法;
  • 通过反射调用类的私有方法时,要先在这个私有方法对应的 Method 对象上调用 setAccessible(true) 来取消对这个方法的访问检查,再调用 invoke() 方法来执行这个私有方法;
  • java.lang.reflect.Method,详见:Class Method;

1. 获得方法对象

  • public Object invoke (Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, nvocationTargetException
  • obj:调用方法的对象;
  • args:为指定方法传递的参数值,是一个可变参数;
  • invoke() 方法的返回值为动态调用指定方法后的实际返回值;

2. 主要方法

类型 方法 说明
Class getDeclaringClass() 得到一个 Class 对象
String getName() 获得 Method 类对象所表示的方法的名字
Class[ ] getParameterTypes() 获得 Method 类对象表示的方法中的参数类型
Object invoke(Object o, Object… args) 调用 Method 类对象表示的方法,相当于对象 o 用参数 args 调用该方法

3. Java 实例

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

class Computer {//计算机类
    private double frequency = 2.0;
    private int RAM = 4;
    private int HardDisk = 500;
    private String CPU = "Intel";

    public Computer()//无参构造方法
    {
    }

    public Computer(double frequency, int RAM, int HardDisk, String CPU)//有参构造方法
    {
        this.frequency = frequency;
        this.RAM = RAM;
        this.HardDisk = HardDisk;
        this.CPU = CPU;
    }

    //为了能实现复制,下面的方法需按Bean 规则写,即setter或getter
    public void setFrequency(double frequency) {
        this.frequency = frequency;
    }

    public double getFrequency() {
        return frequency;
    }

    public void setRAM(int RAM) {
        this.RAM = RAM;
    }

    public int getRAM() {
        return RAM;
    }

    public void setHardDisk(int HardDisk) {
        this.HardDisk = HardDisk;
    }

    public int getHardDisk() {
        return HardDisk;
    }

    public void setCPU(String CPU) {
        this.CPU = CPU;
    }

    public String getCPU() {
        return CPU;
    }

    public String toString() {
        String info = "主频:" + frequency + "MHz 内存:" + RAM + "GB 硬盘:" + HardDisk + "GB CPU:" + CPU;
        return info;
    }
}

public class test {
    public static void main(String args[]) throws Exception {
        //获得一个表示Computer 类的Class 类对象
        Class obj = Class.forName("Computer");
        //获取Computer 类中的构造方法
        Constructor constructor[] = obj.getConstructors();
        System.out.println("Computer 类中的构造方法:");
        for (Constructor con : constructor)//将构造方法输出
            System.out.println(con.toString());
        System.out.println();
        //获取Computer 类中的所有域
        Field field[] = obj.getDeclaredFields();
        System.out.println("Computer 类中的域:");
        for (Field f : field)
            System.out.println(f.toString());
        System.out.println();
        //获取Computer 类中的所有方法
        Method method[] = obj.getDeclaredMethods();
        System.out.println("Computer 类中的方法:");
        for (Method m : method)
            System.out.println(m);
        System.out.println();
        Computer myComputer = new Computer(2.4, 4, 450, "Intel");//声明一个对象
        Computer aComputer = (Computer) duplicate(myComputer);//复制一个对象
        System.out.println("复制后的对象:");
        System.out.println(aComputer.toString());//输出复制后的对象
    }

    private static Object duplicate(Object source) throws Exception {
        //由对象source 获得对应的Class 类对象
        Class classObj = source.getClass();
        //获得source 类对象所在类中的所有域
        Field[] sourceFields = classObj.getDeclaredFields();
        //利用classObj 调用方法newInstance()获得一个新对象
        Object target = classObj.newInstance();
        //将source 对象的域值赋给新对象对应的域
        for (Field sourceField : sourceFields) {
            sourceField.setAccessible(true);//设置域可访问
            //赋值给新对象对应的域值
            sourceField.set(target, sourceField.get(source));
        }
        return target;
    }
}
/*
输出
Computer 类中的构造方法:
public Computer()
public Computer(double,int,int,java.lang.String)

Computer 类中的域:
private double Computer.frequency
private int Computer.RAM
private int Computer.HardDisk
private java.lang.String Computer.CPU

Computer 类中的方法:
public java.lang.String Computer.toString()
public int Computer.getHardDisk()
public int Computer.getRAM()
public void Computer.setCPU(java.lang.String)
public void Computer.setHardDisk(int)
public void Computer.setRAM(int)
public void Computer.setFrequency(double)
public java.lang.String Computer.getCPU()
public double Computer.getFrequency()

复制后的对象:
主频:2.4MHz 内存:4GB 硬盘:450GB CPU:Intel
 */

你可能感兴趣的:(Java)