Java 以下两个要求 怎么在Java中以程序的方式实现? (围绕CORBA和IOR)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 以下两个要求 怎么在Java中以程序的方式实现? (围绕CORBA和IOR)相关的知识,希望对你有一定的参考价值。

基于反向控制来实现MovieList调用MovieFinder的功能,具体要求:1) 基于传统的面向对象的方法来实现电影的查找和显示。2) 使用反向控制中的构造函数法来实现电影的查找和显示。3) 使用反向控制中的get/set函数法来实现电影的查找和显示。回答问题:1)与2),3)的区别是什么?为什么需要反向控制?部分代码:public interface MovieFinder List findAll(); public class MovieLister private MovieFinder finder; public Movie[] moviesDirectedBy(String arg) List allMovies = finder.findAll(); for (Iterator it = allMovies.iterator();it.hasNext();) Movie movie = (Movie) it.next(); if (!movie.getDirector().equals(arg)) it.remove(); return (Movie[]) allMovies.toArray(new Movie[allMovies.size()]); public MovieLister() finder = new MySpecialMovieFinderImplem(); 基于IOR,客户端调用服务端,获得当前时间(Time Service),具体要求:1) 使用面向对象的方法来完成此功能。2) 使用IDL描述接口,编译,客户端获得服务端对象IOR,调用并获得时间。回答问题:1)与2)的区别,2)的优势是什么?//TestTimeServer.idl module TestTimeServerinterface ObjTimeServer string getTime(); ;;//Time Service Component ://TestTimeServerImpl.javaimport CORBA.*;class ObjTestTimeServerImplextends TestTimeServer.ObjTimeServer_Skeleton//which is generated from IDL//Variables//Constructor//Method (Service) Implementationpublic String getTime() throws CORBA.SystemExceptionreturn “Time: “ + new Date().toString();;// TimeServer_Server.java import CORBA.*;public class TimeServer_Server public static void main( String[] argv ) try CORBA.ORB orb = CORBA.ORB.init();…ObjTestTimeServerImpl obj= new ObjTestTimeServerImpl(…);…// print stringified object reference: System.out.println( orb.object_to_string(obj)); catch (CORBA.SystemException e) System.err.println(e); ;//TimeServer_Client.java import CORBA.*;public class TimeServer_Clientpublic static void main( String[] argv ) // pass stringified object reference as argv[0] try CORBA.ORB orb = CORBA.ORB.init();…CORBA.object obj = orb.string_to_object( argv[0]);…TestTimeServer.ObjTimeServer timeServer = ObjTimeServerHelper.narrow(obj);…System.out.println( timeServer.getTime() );catch (CORBA.SystemException e) System.err.println(e); ;

最近在看 JAVA NIO 的相关知识,了解一下IO的底层实现原理。

IO涉及到的底层的概念大致如下:

1) 缓冲区操作。2) 内核空间与用户空间。3) 虚拟内存。4) 分页技术。

一,虚拟存储器

虚拟存储器是硬件异常(缺页异常)、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。

虚拟存储器的三大能力:①将主存看成是一个存储在磁盘上的地址空间的高速缓存。②为每个进程提供了一个一致的地址空间。③保护每个进程的地址空间不被其他进程破坏。

虚拟内存的两大好处:① 一个以上的虚拟地址可指向同一个物理内存地址。② 虚拟内存空间可大于实际可用的硬件内存。

二,用户空间与内核空间

设虚拟地址为32位,那么虚拟地址空间的范围为0~4G。操作系统将这4G分为二部分,将最高的1G字节(虚拟地址范围为:0xC0000000-0xFFFFFFFF)供内核使用,称为内核空间。而将较低的3G字节供各个进程使用,称为用户空间。

每个进程可以通过系统调用进入内核,因为内核是由所有的进程共享的。对于每一个具体的进程,它看到的都是4G大小的虚拟地址空间,即相当于每个进程都拥有一个4G大小的虚拟地址空间。

三,IO操作

一般IO缓冲区操作:

1) 用户进程使用read()系统调用,要求其用户空间的缓冲区被填满。

2) 内核向磁盘控制器硬件发命令,要求从磁盘读入数据。

3) 磁盘控制器以DMA方式(数据不经过CPU)把数据复制到内核缓冲区。

4) 内核将数据从内核缓冲区复制到用户进程发起read()调用时指定的用户缓冲区。

从上图可以看出:磁盘中的数据是先读取到内核的缓冲区中。然后再从内核的缓冲区复制到用户的缓冲区。为什么会这样呢?

因为用户空间的进程是不能直接硬件的(操作磁盘控制器)。磁盘是基于块存储的硬件设备,它一次操作固定大小的块,而用户请求请求的可能是任意大小的数据块。因此,将数据从磁盘传递到用户空间,由内核负责数据的分解、再组合。

内存映射IO:就是复用一个以上的虚拟地址可以指向同一个物理内存地址。将内核空间的缓冲区地址(内核地址空间)映射到物理内存地址区域,将用户空间的缓冲区地址(用户地址空间)也映射到相同的物理内存地址区域。从而数据不需要从内核缓冲区映射的物理内存地址移动到用户缓冲区映射的物理内存地址了。

要求:①用户缓冲区与内核缓冲区必须使用相同的页大小对齐。②缓冲区的大小必须是磁盘控制器块大小(512字节磁盘扇区)的倍数---因为磁盘是基于块存储的硬件设备,一次只能操作固定大小的数据块。

用户缓冲区按页对齐,会提高IO的效率---这也是为什么在JAVA中new 一个字节数组时,指定的大小为2的倍数(4096)的原因吧。

四,JAVA中的IO,本质上是把数据移进或者移出缓冲区。

read()和write()系统调用完成的作用是:把内核缓冲区映射的物理内存空间中的数据 拷贝到 用户缓冲区映射的物理内存空间中。

因此,当使用内存映射IO时,可视为:用户进程直接把文件数据当作内存,也就不需要使用read()或write()系统调用了。

当发起一个read()系统调用时,根据待读取的数据的位置生成一个虚拟地址(用户进程使用的是虚拟地址),由MMU转换成物理地址,若内核中没有相应的数据,产生一个缺页请求,内核负责页面调入从而将数据从磁盘读取到内核缓冲区映射的物理内存中。对用户程序而言,这一切都是在不知不觉中进行。

总之,从根本上讲数据从磁盘装入内存是以页为单位通过分页技术装入内存的。

五,JAVA NIO中的直接缓存和非直接缓存

直接缓存:不是分配于堆上的存储,位于JVM之外,它不受JAVA的GC管理,相当于内核缓冲区。非直接缓存:建立在JAVA堆上的缓存,受JVM管理,相当于用户缓冲区。

根据上面第三点,将直接缓存中的数据写入通道的速度要快于非直接缓存。因为,连接到通道的另一端是文件(磁盘,FileChannel)或者网络(Socket通道),这些都是某种形式上的硬件。那么,对于非直接缓存而言,数据从缓冲区传递到硬件,要经过内核缓冲区中转。而对于直接缓存而言,就不需要了,因为直接缓存已经直接映射到内核缓冲区了。

参考技术A java里边都是对象你把这两个程序的源码按照包的方式分别放好。把写字板main()函数里边的代码copy到登陆界面的登陆成功的地方就可以了。或者你把代码发过来给你改。追问

直接在这里发吗?

直接在这里发吗?

参考技术B 学长啊,代码还在吗?救救孩子吧。。。追问

在的 ~~~

在java中以编程方式编辑apk文件

【中文标题】在java中以编程方式编辑apk文件【英文标题】:Programmatically editing apk files in java 【发布时间】:2012-09-17 23:10:02 【问题描述】:

这个问题有点复杂,请多多包涵: 我有一个 apk 文件,我试图在安装后以编程方式修改。我正在用另一个应用程序编辑它。我首先尝试使用用于 zip 文件管理的内置 java 类来执行此操作,但是当我尝试完全复制除我要修改的文件之外的所有文件并更改我要修改的文件时,应用程序将不再运行。我认为这是因为签名或其他原因,但是当我使用 winRAR 做同样的事情时(解压缩所有文件,创建一个新的 zip 存档,将所有文件复制到具有正常压缩的新 zip 存档中)并将新的 apk ssh 到我的 /data/应用程序文件夹,它工作正常。我的问题是为什么会这样。我认为这可能与 zip headers 或类似的东西有关,有人有什么想法吗?

PS:这是我用来重写 zip 文件的 java 进程的示例:

p = Runtime.getRuntime().exec("su");
ZipInputStream in = new ZipInputStream(new FileInputStream("This is the apk containing the asset I want to use to replace the other asset"));
ZipEntry e;
while((e = in.getNextEntry()) != null)

    if(e.getName().equals("asset i want to use to replace the other asset"))
        break;

ZipOutputStream out = new ZipOutputStream(new FileOutputStream("the output zip file"));
ZipInputStream original = new ZipInputStream(new FileInputStream("the apk i am trying to modify"));
ZipEntry f;
byte[] buf = new byte[1024];
while((f = original.getNextEntry()) != null)

    if(!f.getName().equals("the asset i want to replace"))
    
        out.putNextEntry(new ZipEntry(f.getName()));
        int len;
        while ((len = original.read(buf)) > 0) 
            out.write(buf, 0, len);
        
        original.closeEntry();
        out.closeEntry();
    
    else
    
        out.putNextEntry(new ZipEntry(e.getName()));
        int len;
        while ((len = in.read(buf)) > 0) 
            out.write(buf, 0, len);
        
        out.closeEntry();
    

in.close();
out.close();
original.close();

我已经在 android 系统和使用常规软件的 windows 上运行了这个过程,我可以在 winRAR 中打开输出,除了我更改的资产文件之外,它似乎是相同的。

【问题讨论】:

说出这样做的任何正当理由。 @CommonsWare 因为我想将游戏中的一些图像替换为我自己的一些自定义图像。也因为我还在学习 android 开发,并认为这将是一个很好的实验来帮助我了解有关 android 的东西。还有,为什么不呢? 您是如何从您的应用中获取其他 apk 的?只要您正在制作副本,您似乎就可以为 apk 执行此操作……这就是您在代码中所做的吗? @JRaymond 是的,我正在尝试制作原始 apk 的副本,但在 assets 文件夹中更改了一个图像文件。它似乎可以工作,但由于某种原因,它总是在启动时崩溃。 我认为它不会起作用,因为那时您还需要即时签署 APK 文件。如果你修改它,哈希检查将失败... 【参考方案1】:

您应该知道的唯一一件事是签名 apk 工具的工作原理(解决校验和 - 它们是 zip 条目。目标文件夹是带有 CERT.RSA 的 META-INF - 存在编码校验和以及其他调试信息,CERT。 SF 和 MANIFEST.MF - 使用 SHA1-Digest - Base64 编码的哈希(它们很容易被您自己检测到))。 但这是真正的黑客攻击!该代码可能很有用(并且被许多“聪明的程序员”用于动态更改应用程序的图片)并且可能很危险 - 因为您的 apk 文件可以增加到 GB 大小 - 如果您愿意的话。

我认为这个技巧不应该在世界范围内的人之间传播 - 它会被限制在程序员的小圈子里。

【讨论】:

以上是关于Java 以下两个要求 怎么在Java中以程序的方式实现? (围绕CORBA和IOR)的主要内容,如果未能解决你的问题,请参考以下文章

关于怎么解决java.lang.NoClassDefFoundError错误

xposed 如何主动调用java层类中的方

用java 编写一个程序,在命令行中以树状结构展现特定的文件夹及其子文件(夹)!

Java中两个List的比较以及使用JSTL在JSP中以表格格式显示两个List之间的区别

求教用java编写一个程序要求给定一个日期值,计算若干天后的日期值,和给定两个日期计算它们之间相距的天

java读取TXT文件 我把10万个数字存在了TXT文件中以空格分隔 我想读出来该怎么办(用java )