package entity;public class A {
static {
System.out.println("调用A类a包");
X1 x1=new entity.a.X1();
X2 x2=new entity.a.X2();
X3 x3=new entity.a.X3();
}
}package entity;/**
*
* @author Administrator
*/
public class B {
static {
System.out.println("调用B类b包");
X1 x1=new entity.b.X1();
X2 x2=new entity.b.X2();
X3 x3=new entity.b.X3();
}
}
package entity;public class C {
static {
System.out.println("调用C类c包");
X1 x1=new entity.c.X1();
X2 x2=new entity.c.X2();
X3 x3=new entity.c.X3();
}
}package entity;public class PUB { public static void main(String[] args) {
A a = new A();
B b = new B();
C c = new C();
}}
package entity.a;
public class X1 implements entity.X1{
static {
System.out.println("a.X1");
}
}package entity.a;
public class X2 implements entity.X2{
static {
System.out.println("a.X2");
}
}
package entity.a;
public class X3 implements entity.X3{
static {
System.out.println("a.X3");
}
}b.c包中类似,不一一列举了。
entity包下三个接口X1,X2,X3;
static {
System.out.println("调用A类a包");
X1 x1=new entity.a.X1();
X2 x2=new entity.a.X2();
X3 x3=new entity.a.X3();
}
}package entity;/**
*
* @author Administrator
*/
public class B {
static {
System.out.println("调用B类b包");
X1 x1=new entity.b.X1();
X2 x2=new entity.b.X2();
X3 x3=new entity.b.X3();
}
}
package entity;public class C {
static {
System.out.println("调用C类c包");
X1 x1=new entity.c.X1();
X2 x2=new entity.c.X2();
X3 x3=new entity.c.X3();
}
}package entity;public class PUB { public static void main(String[] args) {
A a = new A();
B b = new B();
C c = new C();
}}
package entity.a;
public class X1 implements entity.X1{
static {
System.out.println("a.X1");
}
}package entity.a;
public class X2 implements entity.X2{
static {
System.out.println("a.X2");
}
}
package entity.a;
public class X3 implements entity.X3{
static {
System.out.println("a.X3");
}
}b.c包中类似,不一一列举了。
entity包下三个接口X1,X2,X3;
解决方案 »
- java web项目中application用得多不多?
- javax.persistence.PersistenceException: org.hibernate.MappingException: Unknown
- 刚刚想到两个问题,请教下大家。
- JSP如何动态的添加和解析虚拟路径
- 请教spring相关的一个错误,不知道什么原因
- 有关struts bean tag的问题
- 我想转向JAVA,但不知从哪下手,恳请各位给个提议,免得我走弯路!
- Struts问题,关于<html:checkbox>标签。
- JBuilder7 的File->New->EJB wrizard项不能使用:请求您的帮助!!
- 请各位看一下这是什么错误
- J2EE项目启动报错
- Spring + SpringMVC + JPA(Hibernate)集成环境持久化问题
run:
调用A类a包
a.X1
a.X2
a.X3
调用B类b包
b.X1
b.X2
b.X3
调用C类c包
c.X1
c.X2
c.X3
A类,B类和C类里面实例化下面各包的类和方法,供PUB调用,这样的话A,B和C类过于庞大,且没有彻底屏蔽其它的b、c包。
这个很难吗竟然提供200分接口A,定义了一个方法sayHello
package com.entity;public interface A {
void sayHello();
}a文件加下A的实现a
package com.entity.a;import com.entity.A;public class a implements A { @Override
public void sayHello() {
System.out.println("hello,I'm in folder a !");
}}b文件夹下A的实现a
package com.entity.b;import com.entity.A;public class a implements A {
@Override
public void sayHello() {
System.out.println("hello,I'm in folder b !");
}
}对外公共类PUB
package com.entity;public class PUB {
public static void main(String[] args) throws Exception {
int positonA=1;//该变量决定访问A接口的哪个实现类,值为0访问a文件夹下的实现类;值为其他值时访问b文件夹下的实现类
String folderName;
if(positonA==0){
folderName="a";
}else {
folderName="b";
}
String path="com.entity."+folderName+".a";
A a1=(A)Class.forName(path).newInstance();
a1.sayHello();
}
}
什么神代码?简单来说,你需要的是面向接口编程!用Class.forname来找到具体实现类,而该类的全名你自己控制就OK了
pub.X1.Y(); //调用的时候 把a、b、c包这层隐藏掉,X1是类名,Y()就是X1的方法
//或者
pub.xxx("X1").Y(); //其中X1就是a、b、c包下的一个类,Y()就是X1的方法
似乎理论上有问题
既然要new,那就得定位到具体的类;
具体的类有9个,起码得有9种不同标志,或者说3x3种;但你上面的调用根本无法区分这么多。多态依赖于调用者的类型,但是pub就是一种类型;X1,X2,X3有三种类型;怎么会定位到9种不同的类?静候大神光临,俺也学习学习。
我们论坛上也有不少高人,期待大神级的代码和构思。
public static void main(String[] args) {
InterfaceService is = IndustryTest.getInterfaceService("a");//a包下的类
PUB p = new PUB(is);
p.test();
is = IndustryTest.getInterfaceService("b");//b包下的类
p.setIs(is);
p.test();
is = IndustryTest.getInterfaceService("c");//c包下的类
p.setIs(is);
p.test();
}
}
package entity;
/**
*
* <p class="detail">
* 生产a、b、c包下的类
* </p>
*
* @ClassName: IndustryTest
* @version V1.0 @date 2015年1月13日 下午4:46:46
*
*
*/
public class IndustryTest {
public static InterfaceService getInterfaceService(String name){
InterfaceService is = null;
try {
is = (InterfaceService)Class.forName(name+".X1").newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return is;
}
}package entity;public interface InterfaceService {
void text();
}
package entity;public class PUB {
private InterfaceService is;
public void test(){
is.text();
}
public InterfaceService getIs() {
return is;
}
public void setIs(InterfaceService is) {
this.is = is;
}
public PUB(InterfaceService is){
this.is = is;
}
}package a;import entity.InterfaceService;public class X1 implements InterfaceService {
@Override
public void text() {
System.out.println("a包下的text方法!!");
}}
package b;import entity.InterfaceService;public class X1 implements InterfaceService { @Override
public void text() {
System.out.println("b包下的text方法!!");
}}
package c;import entity.InterfaceService;public class X1 implements InterfaceService { @Override
public void text() {
System.out.println("c包下的text方法!!");
}}main的结果是a包下的text方法!!
b包下的text方法!!
c包下的text方法!!
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;/**
* Created by Administrator on 2015/1/13.
*/
public class Main1 {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException, IOException, ClassNotFoundException {
for (Class<?> c : getAllAssignedClass(PUB.class)) {
PUB o = (PUB) c.newInstance();
o.sayX1();
/* o.sayX2();
o.sayX3();*/
}
}
/**
* 获取同一路径下所有子类或接口实现类
*
* @param intf
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
public static List<Class<?>> getAllAssignedClass(Class<?> cls) throws IOException,
ClassNotFoundException {
List<Class<?>> classes = new ArrayList<Class<?>>();
for (Class<?> c : getClasses(cls)) {
if (cls.isAssignableFrom(c) && !cls.equals(c)) {
classes.add(c);
}
}
return classes;
}
/**
* 取得当前类路径下的所有类
*
* @param cls
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
public static List<Class<?>> getClasses(Class<?> cls) throws IOException,
ClassNotFoundException {
String pk = cls.getPackage().getName();
String path = pk.replace('.', '/');
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
URL url = classloader.getResource(path);
return getClasses(new File(url.getFile()), pk);
}
/**
* 迭代查找类
*
* @param dir
* @param pk
* @return
* @throws ClassNotFoundException
*/
private static List<Class<?>> getClasses(File dir, String pk) throws ClassNotFoundException {
List<Class<?>> classes = new ArrayList<Class<?>>();
if (!dir.exists()) {
return classes;
}
for (File f : dir.listFiles()) {
if (f.isDirectory()) {
classes.addAll(getClasses(f, pk + "." + f.getName()));
}
String name = f.getName();
if (name.endsWith(".class")) {
classes.add(Class.forName(pk + "." + name.substring(0, name.length() - 6)));
}
}
return classes;
}
}
输出:I'm entity.a X1
I'm entity.b X1
I'm entity.c X1
public interface A {
}
public interface B {
}
public interface C {
}
public class PUB implements A,B,C{//如果还有DEF等更多的话要加上implements后面
public void sayX1(){//如果有更多的方法也要在父类PUB加上
}
public void sayX2(){
}
public void sayX3(){
}
}
package entity.a;import entity.A;
import entity.PUB;/**
* Created by Administrator on 2015/1/13.
*/
public class X1 extends PUB implements A{
public void sayX1(){
System.out.println("I'm entity.a X1");
}
}
package entity.b;import entity.B;
import entity.PUB;/**
* Created by Administrator on 2015/1/13.
*/
public class X1 extends PUB implements B {
public void sayX1(){
System.out.println("I'm entity.b X1");
}
}package entity.c;import entity.C;
import entity.PUB;/**
* Created by Administrator on 2015/1/13.
*/
public class X1 extends PUB implements C{
public void sayX1(){
System.out.println("I'm entity.c X1");
}
}
PUB有若干对外接口,例如B( ),调用X1...Xn的Y( ); PUB还可能有若干对象引用,类型为X1...Xn,需要根据参数决定实际调用哪个包A/B/C中的X1...Xn。
还有,这个需要编译时决定还是运行时决定?
PUB 、 X1、X2、X3是你自己可以修订的类,这种情况最简单PUC实现为:
public class PUB{
String flag ="A";
public PUB(String iflag){
flag=iflag;
}
//如果y函数有参数和返回值相就进行修订
public void y() {
if("A".equals(flag))
a.X1().y();
else if("B".equals(flag))
b.X1().y();
else if("C".equals(flag))
c.X1().y();
else
//异常分支
}
public String getFlag() { return flag; }
public void setFlag(String flag) { this.flag = flag; }
}
----------------------其它依此类推
package entity;public class PUB {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
A.get(X1.class).Y1();
B.get(X1.class).Y1();
C.get(X1.class).Y1();
}}package entity;
public class A{
public static <T>T get(Class<T> clazz) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
Class clazz1=Class.forName("entity.a."+clazz.getSimpleName());
return (T)clazz1.newInstance();
}
}/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/package entity.a;/**
*
* @author Administrator
*/
public class X1 implements entity.X1{ @Override
public void Y1() {
System.out.println("a.X1.Y1()");
}
}package entity;
public interface X1 {
void Y1();
}
运行结果:a.X1.Y1()
b.X1.Y1()
c.X1.Y1()
你非要用类也可以啊。A类、B类、C类为抽象类,具体实现在a、b、c包里。也就是说你不面向接口编程了,面向抽象类编程了。
如果想把类也当成参数也可以在加入一个参数值。
方法也可以写成一个参数,,, 这样只要你在pub中写一个方法就可以调用到所有包下的类中的方法。只要你的参数正确。
然后再动态调用只要在pub类中写一个方法,在main方法中通过传参数来调用不同包,的不同类的不同方法。
package entity;
public class PUB {
public <T>T A(Class<T> clazz) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
return (T)A.get(clazz);
}
public <T>T B(Class<T> clazz) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
return (T)B.get(clazz);
}
public <T>T C(Class<T> clazz) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
return (T)C.get(clazz);
}
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
PUB pub=new PUB();
pub.A(X1.class).Y1();
}单独用字符串作为参数去调用似乎有些问题;
因为无法确定返回对象的类型;
因为字符串中无法使用类型变量;
也就无法决定返回值的类型。当然,可以这样写:package entity;
public class PUB {
public <T>T A(String t) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
Class clazz=Class.forName("entity."+t);
return (T)A.get(clazz);
}
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
PUB pub=new PUB();
pub.<X1>A("X1").Y1();
}}但这样看上去并没有省事。或者不指定类型参数,而是在字符串调用返回Object类型对象后手动进行类型转换。
public static void main(String[] args) throws ClassNotFoundException {
//无返回的时候
new PUB("a","X1","text",null).test();
new PUB("a","X1","text2",new Object[]{"张三"}).test();
new PUB("b","X1","text",null).test();
new PUB("b","X1","text2",new Object[]{"李四"}).test();
new PUB("c","X1","text",null).test();
new PUB("c","X1","text2",new Object[]{"王五"}).test();
new PUB("a","X2","bbb",null).test();
//有返回的时候
Object o = new PUB("a","X2","aa",null).test2();
System.out.println(o.toString());
//返回对象的时候
Object o1 = new PUB("b","X2","test",new Object[]{"哈哈,可以的",19}).test2();
User u = (User)o1;
System.out.println(u.getAge());
System.out.println(u.getName());
}
}
package entity;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class PUB {
private String packageName;
private String className;
private String methodName;
private Object[] params=null;
//无返回值的方法调用
public void test() throws ClassNotFoundException{
Class c = Class.forName(packageName+"."+className);
Method[] methods = c.getMethods();
for(Method m : methods){
if(m.getName().equals(methodName)){
try {
try {
m.invoke(c.newInstance(), params);
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//没有参数时直接传入空
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//有返回值的方法调用
public Object test2() throws ClassNotFoundException{
Class c = Class.forName(packageName+"."+className);
Method[] methods = c.getMethods();
Object o = null;
for(Method m : methods){
if(m.getName().equals(methodName)){
try {
try {
o = m.invoke(c.newInstance(), params);
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//没有参数时直接传入空
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return o;
}
public PUB(String packageName, String className, String methodName,
Object[] params) throws ClassNotFoundException {
super();
this.packageName = packageName;
this.className = className;
this.methodName = methodName;
this.params = params;
} public PUB() {
super();
} public String getClassName() {
return className;
} public void setClassName(String className) {
this.className = className;
} public String getMethodName() {
return methodName;
} public Object[] getParams() {
return params;
} public void setMethodName(String methodName){
this.methodName = methodName;
}
public void setParams(Object[] params){
this.params = params;
} public String getPackageName() {
return packageName;
} public void setPackageName(String packageName) {
this.packageName = packageName;
}
}package a;public class X2 {
public void bbb(){
System.out.println("a包下的X2类的bbb方法");
}
public String aa(){
return "哈哈";
}
}package a;public class X1 {
public void text(){
System.out.println("a包下的text方法");
}
public void text2(String name){
System.out.println("a包下的text2,参数name的值为:"+name);
}
}package b;public class X1 {
public void text(){
System.out.println("b包下的text方法");
}
public void text2(String name){
System.out.println("b包下的text2,参数name的值为:"+name);
}
}package b;import entity.User;public class X2 {
public User test(String name,int age){
User u = new User();
u.setName(name);
u.setAge(age);
return u;
}
}package c;public class X1 {
public void text(){
System.out.println("c包下的text方法");
}
public void text2(String name){
System.out.println("c包下的text2,参数name的值为:"+name);
}
}只要在BUP里有两个方法就可以了,当然 你也可以把两个方法写成一个方法
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
结果:a包下的text方法
a包下的text2,参数name的值为:张三
b包下的text方法
b包下的text2,参数name的值为:李四
c包下的text方法
c包下的text2,参数name的值为:王五
a包下的X2类的bbb方法
哈哈
19
哈哈,可以的
3 核心类的实现图:
4 辅助类图:
5抽象:
1,最理想的调用方式:
PUB pub = new PUB
pub.X1.Y(); //调用的时候 把a、b、c包这层隐藏掉,X1是类名,Y()就是X1的方法
//或者
pub.xxx("X1").Y(); //其中X1就是a、b、c包下的一个类,Y()就是X1的方法
2,以最简明扼要的代码实现,贴出相关代码,使观者能理解整个调用流程;
3,不要告诉我用什么模式、什么框架可以实现,要说理论我也能说出一大堆,但是自己去写又有几人能写出来呢
4,以代码最优者给全分【200】,如果都没有达到要求者,每楼层平均分配。
---------------------
1.关于第一点,在前一个帖子中已经写得和你要的调用方式一模一样了,你到底向要哪样
3.设计模式怎么了,经典就是经典,自有它的价值,有人提出来,那你也应该去了解一下,不是天天说不要重复造轮子吗,
抽象工厂模式:我举个例子,和你的这个几乎一模一样:
一个系统数据库有两种实现分别为 Oracl和MySql,:具体使用哪个数据库是卸载配置文件里面的,在系统启动时就确定了用那种数据库,有一个抽象的AbstractDatabaseFactory,为什么抽象满是以为内有一些公用的方法,然后两个实现类,那么对于整个系统来说,完全屏蔽了数据库的差异性,使用的时候该怎么用就怎么用,和你这个一样了。
5.没看出和上一贴有什么不同的,无力吐槽,既然是别处的帖子,那么是否可以给个链接可以瞧瞧,美其名曰学习交流
throws Exception { Class<?>[] clazzs = new Class<?>[objects.length];
for (int i = 0; i < objects.length; i++) {
clazzs[i] = objects[i].getClass();
} Class<?> clazz = Class.forName(className);
Object obj = clazz.newInstance();
Method method = clazz.getMethod(methodName, clazzs);
method.invoke(obj, objects);
}
从你举的例子能看出来你已经了解了我的想法,但是还有一定的区别,兼容各种数据库的系统有很多,如果使用持久层框架如hibernate、mybatis、Apache Cayenn的话就很简单,但是如果不用这些框架的话有几人能写的出来,而且是在开发过程中屏蔽其它数据库。咳。扯远了。你在上贴的代码我也看了,所有的X1、X2....Xn都要实现EntityInterface接口,显然是不是很合适,你可以看看19楼 skyhitnow的代码,已经基本上实现了,只是略有一些瑕疵。最后不管如何,也非常感谢对本帖和上贴的支持和关注。
com.pub.a.x1
package com.pub.a;
public class X1 implements com.pub.X1 { public void m1() {
System.out.println("A.X1.m1");
}}
主类。package com.pub;public class PUB<E> {
//a ,b,c 包中的类 为public
public E dispatcher(Class clazz ) throws InstantiationException, IllegalAccessException{
//
return (E) clazz.newInstance();
}
//a ,b,c 包中的类 为非public
public E dispatcher(String clazz ) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
return (E) Class.forName(clazz).newInstance();
}
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
PUB<X1> f =new PUB<X1>();
f.dispatcher(com.pub.a.X1.class).m1();
f.dispatcher("com.pub.a.X1").m1();
}}调用方式
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
PUB<X1> f =new PUB<X1>();
f.dispatcher(com.pub.a.X1.class).m1();
f.dispatcher("com.pub.a.X1").m1();
}
另外一种实现方式。此方式。各模块中的 类必须为public 才能使用
package com.pub;public class Pub1<E> {
public E dispatcher(E e){
return e;
}
public static void main(String[] args) {
Pub1<X1> f =new Pub1<X1>();
f.dispatcher(new com.pub.a.X1()).m1();
}
}