抽象类问题 能不能在不实现抽象类的情况下 去执行抽象类中的非抽象方法

Stluny 2016-01-14 09:09:41
可能是设计的不太合理 现在有需求 我想直接用子类不经过父类去调用爷爷类的方法 爷爷类是个抽象类 无法实例化 很头疼。。 想用反射来着 也不行。。 有没有大神 给出出主意 可以直接调用抽象类的非抽象方法。。 感激不尽。。

对了 父类 和爷爷类 都是class文件 不能改。。。 哎。。
...全文
197 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
解开者 2016-01-14
  • 打赏
  • 举报
回复
你不是试过反射吗……有了实例之后再反射调用就行了,无视可见性的
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.CallbackFilter;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.proxy.NoOp;

public class CglibTest {
	public static void main(String[] args) throws IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		Enhancer e = new Enhancer();
		e.setSuperclass(S.class);
		e.setCallbacks(new Callback[] { new MethodInterceptor() {
			@Override
			public Object intercept(Object o, Method m, Object[] args,
					MethodProxy mp) throws Throwable {
				return mp.invokeSuper(o, args);
			}
		}, NoOp.INSTANCE });
		e.setCallbackFilter(new CallbackFilter() {
			@Override
			public int accept(Method m) {
				return m.getName().equals("f") ? 0 : 1;
			}
		});
		S s = (S) e.create();
		Method m = S.class.getDeclaredMethod("f");
		m.setAccessible(true);
		m.invoke(s);
	}
}

abstract class S {
	private void f() {
		System.out.println("Hello");
	}
}
Stluny 2016-01-14
  • 打赏
  • 举报
回复
引用 4 楼 windowsoahil 的回复:
import java.lang.reflect.Method;

import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.CallbackFilter;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.proxy.NoOp;

public class CglibTest {
	public static void main(String[] args) {
		Enhancer e = new Enhancer();
		e.setSuperclass(S.class);
		e.setCallbacks(new Callback[] { new MethodInterceptor() {
			@Override
			public Object intercept(Object o, Method m, Object[] args,
					MethodProxy mp) throws Throwable {
				return mp.invokeSuper(o, args);
			}
		}, NoOp.INSTANCE });
		e.setCallbackFilter(new CallbackFilter() {
			@Override
			public int accept(Method m) {
				return m.getName().equals("f") ? 0 : 1;
			}
		});
		S s = (S) e.create();
		s.f();
	}
}

abstract class S {
	void f() {
		System.out.println("Hello");
	}
}
试了一下 有点问题。。 我要用的那个方法是protected。。 然后调不到 有什么方法可以解决么? 求大神指导~!!
Stluny 2016-01-14
  • 打赏
  • 举报
回复
引用 4 楼 windowsoahil 的回复:
import java.lang.reflect.Method;

import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.CallbackFilter;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.proxy.NoOp;

public class CglibTest {
	public static void main(String[] args) {
		Enhancer e = new Enhancer();
		e.setSuperclass(S.class);
		e.setCallbacks(new Callback[] { new MethodInterceptor() {
			@Override
			public Object intercept(Object o, Method m, Object[] args,
					MethodProxy mp) throws Throwable {
				return mp.invokeSuper(o, args);
			}
		}, NoOp.INSTANCE });
		e.setCallbackFilter(new CallbackFilter() {
			@Override
			public int accept(Method m) {
				return m.getName().equals("f") ? 0 : 1;
			}
		});
		S s = (S) e.create();
		s.f();
	}
}

abstract class S {
	void f() {
		System.out.println("Hello");
	}
}
我试试。。
Stluny 2016-01-14
  • 打赏
  • 举报
回复
引用 3 楼 windowsoahil 的回复:
使用CGLib代理生成抽象类的子类实例就可以,之后上代码
不能用子类实例。。 子类里把我需要用的方法给重写了。。 大概是这样的 我自己写的类是 class A A的父类是 class B B的父类是 class C class C里 有个方法 比如 123(){} B里有个方法 重写了 123(){} 我要在A里用 C的123(){}方法 不要B的123(){}方法 代码不能贴。。 公司保密。。
解开者 2016-01-14
  • 打赏
  • 举报
回复
import java.lang.reflect.Method;

import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.CallbackFilter;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.proxy.NoOp;

public class CglibTest {
	public static void main(String[] args) {
		Enhancer e = new Enhancer();
		e.setSuperclass(S.class);
		e.setCallbacks(new Callback[] { new MethodInterceptor() {
			@Override
			public Object intercept(Object o, Method m, Object[] args,
					MethodProxy mp) throws Throwable {
				return mp.invokeSuper(o, args);
			}
		}, NoOp.INSTANCE });
		e.setCallbackFilter(new CallbackFilter() {
			@Override
			public int accept(Method m) {
				return m.getName().equals("f") ? 0 : 1;
			}
		});
		S s = (S) e.create();
		s.f();
	}
}

abstract class S {
	void f() {
		System.out.println("Hello");
	}
}
解开者 2016-01-14
  • 打赏
  • 举报
回复
使用CGLib代理生成抽象类的子类实例就可以,之后上代码
Stluny 2016-01-14
  • 打赏
  • 举报
回复
继续求助 继续求助 继续求助 继续求助
Stluny 2016-01-14
  • 打赏
  • 举报
回复
这是要沉? 不行啊。。 快来大神
Stluny 2016-01-14
  • 打赏
  • 举报
回复
引用 8 楼 windowsoahil 的回复:
你不是试过反射吗……有了实例之后再反射调用就行了,无视可见性的
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.CallbackFilter;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.proxy.NoOp;

public class CglibTest {
	public static void main(String[] args) throws IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		Enhancer e = new Enhancer();
		e.setSuperclass(S.class);
		e.setCallbacks(new Callback[] { new MethodInterceptor() {
			@Override
			public Object intercept(Object o, Method m, Object[] args,
					MethodProxy mp) throws Throwable {
				return mp.invokeSuper(o, args);
			}
		}, NoOp.INSTANCE });
		e.setCallbackFilter(new CallbackFilter() {
			@Override
			public int accept(Method m) {
				return m.getName().equals("f") ? 0 : 1;
			}
		});
		S s = (S) e.create();
		Method m = S.class.getDeclaredMethod("f");
		m.setAccessible(true);
		m.invoke(s);
	}
}

abstract class S {
	private void f() {
		System.out.println("Hello");
	}
}
哦对对 傻了傻了 谢谢大神 ~

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧