小编mar*_*art的帖子

跨不同类加载器覆盖默认访问器方法会破坏多态性

在尝试使用默认访问器覆盖方法时,我遇到了一种奇怪的行为(例如:)void run().根据Java规范,如果类属于同一个包,则类可以使用或覆盖基类的默认成员.当所有类从同一个类加载器加载时,一切正常.但是如果我尝试从单独的类加载器加载子类,则多态性不起作用.

这是样本:

App.java:

import java.net.*;
import java.lang.reflect.Method;

public class App {
    public static class Base {
        void run() {
            System.out.println("error");
        }
    }
    public static class Inside extends Base {
        @Override
        void run() {
            System.out.println("ok. inside");
        }
    }
    public static void main(String[] args) throws Exception {
        {
            Base p = (Base) Class.forName(Inside.class.getName()).newInstance();
            System.out.println(p.getClass());
            p.run();
        } {
            // path to Outside.class
            URL[] url = { new URL("file:/home/mart/workspace6/test2/bin/") };
            URLClassLoader ucl = URLClassLoader.newInstance(url);
            final Base p …
Run Code Online (Sandbox Code Playgroud)

java polymorphism inheritance classloader

7
推荐指数
1
解决办法
2837
查看次数

标签 统计

classloader ×1

inheritance ×1

java ×1

polymorphism ×1