使用Java Reflections覆盖另一个类的方法

时间:2017-08-02 04:51:32

标签: java class reflection annotations override

我有一个Java项目,我有2个类。我需要使用Java反射来首先打印由ProjectAccount.javamywork.java中的构造函数设置的默认值,然后我需要覆盖toString()方法以传递{{1}的值类和打印它们。

我能够使用java反射来打印默认的构造函数集值。但是在尝试使用参数覆盖和打印mywork.java方法时出现错误。

ProjectAccount.java

toString()

mywork.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;
    }
}

输出和错误

output

我想我遇到了这个错误,因为我还没有覆盖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; } } 方法。有关如何覆盖和打印此内容的任何建议都将受到高度赞赏。

2 个答案:

答案 0 :(得分:0)

那里有一些问题。

  1. 覆盖toString是通过定义实例方法(你的是静态的)
  2. 您的反思访问权限为mets,引用了ProjectAccount
  3. mywork不是ProjectAccount
  4. 的子类
  5. 您无法添加参数,
  6.   

    子类覆盖方法的能力允许类从行为“足够接近”的超类继承,然后根据需要修改行为。覆盖方法具有相同的名称,参数的数量和类型,以及返回类型作为它覆盖的方法。重写方法还可以返回由重写方法返回的类型的子类型。此子类型称为协变返回类型。

    Oracle Docs

    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";
        }
    
    }
    

答案 1 :(得分:0)

我刚刚修改了const checkAuth = (req, res, next) => { // logic for checking auth if (authorized) { return next(); } res.status(401).send('NEED AUTH'); }; router.post('/login', checkAuth, (req, res, next) => { // actual logic for login }); 类来直接访问router.post('/logic', checkAuth, rateLimit, (req, res, next) => {}); 类变量并设置它们。

我访问了声明的字段,并根据变量的名称或类型修改了声明的变量,并调用了相同的mywork.java方法而没有覆盖ProjectAccount.java方法。

<强> mywork.java

toString()

<强>输出

output