引入接口目的是把实现者和用户相分离,但是反射还是可以访问实现者
2017-03-31 20:29
411 查看
package:包,自己看成是文件夹。
package access : 就是一个文件夹下的类都可以相互调用。
目的:
1、写了一个接口,里面有一些方法可以使用
2、写了一个接口的实现类。
不想其它的人员接触我的接口实现类,哪么使用了包访问。
实现步骤:
1、写一个接口:package ftypeinfo(包名)
2、写接口实现类 :ftypeinfo.packageaccess;(包名)
3、接口使用类:package ftypeinfo;(包名和接口java文件放在一起)
注:接口,接口使用类的java文件放在一个包里
接口实现类:放入另一包里,并提供了一个方法和接口类相连接。
所以接口使用类不能对接口实现类进行任何操作
一、接口
package ftypeinfo;
public interface A {
void f();
}
二、接口使用类,由于文件夹不一样,所以不能使用接口的实现类
但是可以 import ftypeinfo.packageaccess.HiddenC;导入进来
使用它的 public class下的方法。
package ftypeinfo;
import java.lang.reflect.Method;
import ftypeinfo.packageaccess.HiddenC;
public class HiddenImplementation {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
A a=HiddenC.makeA();
a.f();
//这里有点讽刺,本来不想外部的文件夹下的Java类使用
但是当这个类运行时入内存后,使用RTTI,还是可以使用隐藏的方法,
所以类中的一切(方法,类数据),不管是私有,保护,内部类,匿名类,类成员数据,
RTTI全部可以使用,更改一个类里面的数据,自动调用其方法。
callHiddenMethod(a,"g");
callHiddenMethod(a,"u");
callHiddenMethod(a,"v");
callHiddenMethod(a,"w");
}
//RTTI:可以得到运行时类的所有信息,并调用其方法。
static void callHiddenMethod(Object a,String methodName)
throws Exception{
Method g=a.getClass().getDeclaredMethod(methodName);
g.setAccessible(true);
g.invoke(a);
}
}
三、接口实现类:class C ,class 前面什么也没写,表示包访问,
packageaccess 文件夹下的所有JAVA文件都能访问class C 里面的方法。其它文件夹不能访问。
package ftypeinfo.packageaccess;
import ftypeinfo.A;
import static net.mindview.util.Print.*;
class C implements A{
public void f(){print("public c.f()");}
public void g(){print("public c.g()");}
void u(){print("public c.u()");}
protected void v(){print("public c.v()");}
private void w(){print("public c.w()");}
}
public class HiddenC {
//提供外部可直接调用的方法,只有放入接口实现类的对象,这个接口才真正可以使用。
public static A makeA() {return new C();}
}
package access : 就是一个文件夹下的类都可以相互调用。
目的:
1、写了一个接口,里面有一些方法可以使用
2、写了一个接口的实现类。
不想其它的人员接触我的接口实现类,哪么使用了包访问。
实现步骤:
1、写一个接口:package ftypeinfo(包名)
2、写接口实现类 :ftypeinfo.packageaccess;(包名)
3、接口使用类:package ftypeinfo;(包名和接口java文件放在一起)
注:接口,接口使用类的java文件放在一个包里
接口实现类:放入另一包里,并提供了一个方法和接口类相连接。
所以接口使用类不能对接口实现类进行任何操作
一、接口
package ftypeinfo;
public interface A {
void f();
}
二、接口使用类,由于文件夹不一样,所以不能使用接口的实现类
但是可以 import ftypeinfo.packageaccess.HiddenC;导入进来
使用它的 public class下的方法。
package ftypeinfo;
import java.lang.reflect.Method;
import ftypeinfo.packageaccess.HiddenC;
public class HiddenImplementation {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
A a=HiddenC.makeA();
a.f();
//这里有点讽刺,本来不想外部的文件夹下的Java类使用
但是当这个类运行时入内存后,使用RTTI,还是可以使用隐藏的方法,
所以类中的一切(方法,类数据),不管是私有,保护,内部类,匿名类,类成员数据,
RTTI全部可以使用,更改一个类里面的数据,自动调用其方法。
callHiddenMethod(a,"g");
callHiddenMethod(a,"u");
callHiddenMethod(a,"v");
callHiddenMethod(a,"w");
}
//RTTI:可以得到运行时类的所有信息,并调用其方法。
static void callHiddenMethod(Object a,String methodName)
throws Exception{
Method g=a.getClass().getDeclaredMethod(methodName);
g.setAccessible(true);
g.invoke(a);
}
}
三、接口实现类:class C ,class 前面什么也没写,表示包访问,
packageaccess 文件夹下的所有JAVA文件都能访问class C 里面的方法。其它文件夹不能访问。
package ftypeinfo.packageaccess;
import ftypeinfo.A;
import static net.mindview.util.Print.*;
class C implements A{
public void f(){print("public c.f()");}
public void g(){print("public c.g()");}
void u(){print("public c.u()");}
protected void v(){print("public c.v()");}
private void w(){print("public c.w()");}
}
public class HiddenC {
//提供外部可直接调用的方法,只有放入接口实现类的对象,这个接口才真正可以使用。
public static A makeA() {return new C();}
}
相关文章推荐
- 在校园网内如果把自己的电脑做为服务器让无论内网还是外网的用户可以访问?
- ArrayList和LinkedList都是实现了List接口的类,他们都是元素的容器,用于存放对象的引用; 他们都可以对存放的元素进行增删改查的操作,还可以进行排序。 但是,他们还是有区别的。
- 字符串处理是许多程序中非常重要的一部分,它们可以用于文本显示,数据表示,查找键和很多目的.在Unix下,用户可以使用正则表达式的强健功能实现这些 目的,从Java1.4起,Java核心API就引入了java.util.regex程序包,它是一种有价值的基础
- sql server 杯具了。突然无法访问, 但是还是可以启动服务。
- C#静态方法在多用户并发访问时,运行情况到底是什么样?是排队等待?还是并发的?
- SAP ABAP/4学习---如何给写好的一个程序分配事务代码,用户可以直接通过事务码来访问程序.或者加入收藏夹(9)
- 区分用户是电脑还是手机访问(ASP源码)
- 用这个也是便利进行历史操作也是可以 达到选择的 但是我还是觉得求摸的过程好用。
- 给Mysql添加一个可以远程访问的用户
- Apache 使用localhost(127.0.01 )可以访问,但是使用本机IP(局域网)不能访问的解决办法
- postgre数据库 在conf文件中 添加ip 使其他用户可以访问我的数据库(局域网)
- IEnumerable 接口---实现该接口里的成员的类,可以使用foreach循环访问集合
- web应用程序中页面无法直接访问Profile,但是网站中可以。
- 动态加载用户控件----以用户控件的方式达到代码分离的目的[转]
- 在.NET下如何用WebService实现身份认证,及如何跟踪用户的访问,如类似Possport的功能,不会还是用Session吧?
- 管理员可以正常使用,但是其它用户就不可以了,请看图?
- 使用了继承、多态还有工厂模式和反射,但是还是没有OO的感觉。[已经增加了实现的代码]
- tomcat5发布后,jsp目录不能访问,但是目录里面的页面可以访问
- php如何判断用户通过手机wap访问还是电脑直接访问
- 虎年第一件大喜事:公网用户可以直接访问内网了。