簡體   English   中英

使用Java Reflections覆蓋另一個類的方法

[英]Override a method of another class using Java Reflections

我有一個Java項目,其中有2個課程。 我需要使用Java反射來首先打印mywork.java類中由ProjectAccount.java的構造函數設置的默認值,然后需要重寫toString()方法以從mywork.java類傳遞值並打印它們。

我能夠使用Java反射來打印默認的構造函數集值。 但是嘗試覆蓋和打印帶有參數的toString()方法時出現錯誤。

ProjectAccount.java

package relive;

public class ProjectAccount {
    private String projectAccountID;
    private double budget;
    public int noOfProjects;

    public ProjectAccount(){
        this.projectAccountID = "MARTINDAWS-BillAnalyzer-001";
        this.budget = 120000.00;
        this.noOfProjects = 10;
    }

    @Override
    public String toString(){
        return "Project Accoutn ID = " + projectAccountID + " , Project Budget = "+budget + " , No of Projects = "+ noOfProjects;
    }
}

mywork.java

package relive;

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

public class mywork {

    public static void main(String[] args) {
        try{
            Class<?> clazz = Class.forName("relive.ProjectAccount");
            Constructor<?> constr = clazz.getDeclaredConstructor(null);
            Method mets = clazz.getDeclaredMethod("toString", null);
            Object obj = constr.newInstance(new Object[] {});

            //Print Default values
            System.out.println(mets.invoke(obj, null));

            String mod_projectAccountID="ORPT-BT-EMP-DEV";
            double mod_budget = 2200000.0;
            int mod_noOfProjects = 20;

            //Print new passed values using the overridden method
            System.out.println(mets.invoke(obj, mod_projectAccountID,mod_budget, mod_noOfProjects));        
        }

        catch(ClassNotFoundException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e){
            e.printStackTrace();
        }
    }
    public static String toString(String mod_projectAccountID, double mod_budget, int mod_noOfProjects){
        return "Project Accoutn ID = " + mod_projectAccountID + " , Project Budget = "+mod_budget + " , No of Projects = "+ mod_noOfProjects; 
    }

}

輸出和錯誤

輸出

我猜我遇到了這個錯誤,因為我還沒有重寫toString()方法。 任何有關如何覆蓋和打印此內容的建議將不勝感激。

那里有一些問題。

  1. 覆蓋toString是通過定義實例方法(您是靜態的)
  2. 您的反射訪問權限是mets ,它引用了ProjectAccount
  3. mywork不是ProjectAccount的子類
  4. 您不能添加參數,

子類重寫方法的能力允許類從行為“足夠接近”的超類繼承,然后根據需要修改行為。 覆蓋方法與其覆蓋的方法具有相同的名稱,數量和參數類型,並且返回類型相同。 重寫方法還可以返回重寫方法返回的類型的子類型。 此子類型稱為協變返回類型。

Oracle文檔

package de.me.example;

public class SuperType {

    @Override
    public String toString() {

        return "SuperType";
    }

}


package de.me.example;

public class SubType extends SuperType {

    // this annatotion is syntactic sugar nothing more,
    //it behaves the same without it
    @Override
    public String toString() {
        return "SubType";
    }

}

我剛剛修改了mywork.java類,以直接訪問ProjectAccount.java類變量並進行設置。

我訪問了聲明的字段,並根據變量的名稱或類型修改了聲明的變量,並調用了相同的toString()方法,而不覆蓋toString()方法。

mywork.java

package relive;

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

public class answer_a {

    public static void main(String[] args) {
        try{
            Class<?> clazz = Class.forName("relive.ProjectAccount");
            Constructor<?> constr = clazz.getDeclaredConstructor(null);
            Method mets = clazz.getDeclaredMethod("toString", null);
            Object obj = constr.newInstance(new Object[] {});

            //Print Default values
            System.out.println(mets.invoke(obj, null));

            String mod_projectAccountID= "ORPT-BT-EMP-DEV";
            double mod_budget = 2200000.0;
            int mod_noOfProjects = 20;

            //Method that accesses the Fields and modifies them with the new variables

            Field [] fields = clazz.getDeclaredFields();
            for(int y=0; y<fields.length; y++){
                fields[y].setAccessible(true);

                if(fields[y].getName() == "projectAccountID"){
                    fields[y].set(obj, mod_projectAccountID);
                }
                else if(fields[y].getType().getSimpleName() == "double"){
                    fields[y].set(obj, mod_budget);
                }
                else if (fields[y].getType().getSimpleName() == "int"){
                    fields[y].set(obj, mod_noOfProjects);
                }
            }

            System.out.println(mets.invoke(obj, null));

        }
        catch(ClassNotFoundException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e){
            e.printStackTrace();
        }
    }

}

輸出量

輸出

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM