java缺省包详解_Java在其它包中无法引用缺省包中的类

1、现象

1.1 问题场景

最近,在写测试代码时,将一个类(这里暂且称为ClassA)放在在缺省包中,也就是说,直接放在了src目录下,没有创建包。然后,将这个类打入了jar文件,提供给另外的工程(这里称为ProjA)用,结果发现了非常神奇的现象。

在ProjA中,如果从缺省包中引用ClassA,可以引用到。但是,如果创建一个包,在包中引用ClassA就会发现,引用不到,报错类找不到。第一反应是,是不是需要import啊?想写一个import语句。但是,由于ClassA放在缺省包中,也没法通过import包的方式引用这个类(因为没有包名)。这就比较尴尬了。

搜了下,发现不只是jar包中存在这个问题。这是java的一个普遍现象:Java在其它包中无法引用缺省包中的类。

1.2 机制解析

其实,细想一下,这个也比较好理解。因为如果在包中不指定报名引用一个类,一般是引用同一个包中的类。直觉上,我们可能会认为,如果在同一个包中找不到的这个类,java应该取缺省包看看,找下缺省包中是否能够找到这个类。然而,令人失望的是java现在没有这个机制(当然,也有可能是因为引入这个机制之后,会导致混乱。嗯,这个原因的可能性非常大。。。)。

2、解决方法

这里解决的方法也算是比较容易。大家在写java代码时,一定要注意尽量将类放在一个显式指定的包中,不要直接扔在缺省包中。

上面的方法适用于事前控制。如果情况已经出了,那么该如何在其他包中访问缺省包中的类呢?答案就是在于java的反射机制。

2.1 反射介绍

在Java语言中,可以通过如下的反射机制调用一个类的方法。具体如下:

首先通过反射获得指定类对应的Class对象

Class c = Class.forName("被调用类名");

获得指定类中的方法(通过传入方法名、参数类型等确认)

Method method= c.getMethod("被调用方法名", new Class[] { 参数列表类型 });

通过invoke方法,传入执行方法的类实例和方法参数,完成方法调用

Object value = method.invoke(class.newInstance(), new Object[]{ new String("参数一"),new String("参数二")});

如果要调用的方法是类的静态方法,就不需要传入实例,实例指定为null即可。

Object value = method.invoke(null, new Object[]{ new String("参数一"),new String("参数二")});

比如,想调用的类名为MyClass,其中有方法为String myMethod(String str1,String str2);则调用如下:

Class class = Class.forName("MyClass");

Method method= snmpHandler.getMethod("myMethod", new Class[] { String.class,String.class });

String value = method.invoke(class.newInstance(), new Object[]{ new String("str1"), new String("str2")});

//如果是静态方法

//String value = method.invoke(null, new Object[]{ new String("str1"), new String("str2")});

2.2 例子

先上代码:

HelloWorld.java:

/**

* Created by chengxia on 2019/4/13.

*/

public class HelloWorld {

public static void helloWorld(String name, String words){

System.out.println("Below is the output of HelloWorld class in the Default package.");

System.out.println(name + " said: " + words);

}

}

代码的工程结构如下图。

b7f70bd2dfc4?utm_campaign=maleskine

Test Module Structure

(1) CallHelloWorld1.java

package com.util.call;

/**

* Created by chengxia on 2019/4/13.

*/

public class CallHelloWorld1 {

public static void main(String []args){

HelloWorld.helloWorld("Kobe", "Mamba out!");

}

}

CallHelloWorld1类在包com.util.call中,当其引用HelloWorld类时,报错找不到,如下图。

b7f70bd2dfc4?utm_campaign=maleskine

Cannot Find Class in Default Package

这里为了下面的测试能够正常运行,在下面将报错的这行注释掉了。

(2) CallHelloWorld0.java

/**

* Created by chengxia on 2019/4/13.

*/

public class CallHelloWorld0 {

public static void main(String []args){

HelloWorld.helloWorld("Kobe", "Mamba out!");

}

}

CallHelloWorld0由于也在缺省包,所以可以正常引用HelloWorld类。运行如下:

Below is the output of HelloWorld class in the Default package.

Kobe said: Mamba out!

Process finished with exit code 0

(3) CallHelloWorld2.java

package com.util.call;

import java.lang.reflect.Method;

/**

* Created by chengxia on 2019/4/13.

*/

public class CallHelloWorld2 {

public static void main(String []args){

try

{

Class c = Class.forName("HelloWorld");

Method m = c.getMethod("helloWorld", new Class[]{String.class, String.class});

m.invoke(null, new Object[]{new String("Kobe"), new String("Mamba out!")});

}catch(Exception e){

e.printStackTrace();

}

}

}

CallHelloWorld2类在包com.util.call中,为了能正常调用HelloWorld类的方法,用了反射。可以正常运行,如下。

Below is the output of HelloWorld class in the Default package.

Kobe said: Mamba out!

Process finished with exit code 0

参考资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

myeclipse开发代码颜色搭配保护视力

废话不多说,这个东西主要是为了保护视力的,另外我也挺喜欢上边的颜色搭配的,今天特拿出来分享。直接上图 转载于:https://www.cnblogs.com/suncoolcat/p/3293895.html

linux下qt5静态编译器_笔记-linux下Qt5.3.2 静态编译

这里主要讲linux下的编译,windows下面比较简单依赖sudo apt-get install"^libxcb.*"libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev编译选项configure -confirm-license -opensource -static -release -no-qml-debug -qt-freetype -qt-xcb -n…

猜字小游戏java方法体_java实现猜字小游戏

闲来无事,实现一个猜数字的小游戏,目的是巩固自己的基础知识,培养敲代码的乐趣。首先在项目中所创建的类中导包(视频教程推荐:java课程)import java.util.Scanner;//一个简单的文本扫描器,可以使用正则表达式解析原始类…

Aixs2发布webservice服务

http://www.blogjava.net/pzxsheng/archive/2012/12/21/393319.html 开发前准备: 1、Eclipse Java EE IDE(Juno Service Release 1),这个必须是for J2EE 的IDE,因为发布webservice的插件所需。 下载地址&…

快照java开源_maven快照版本和发布版本

在使用maven过程中,我们在开发阶段经常性的会有很多公共库处于不稳定状态,随时需要修改并发布,可能一天就要发布一次,遇到bug时,甚至一天要发布N次。我们知道,maven的依赖管理是基于版本管理的,…

java里的sleuth_java基础之spring cloud微服务快速教程之(十一) Sleuth(zipkin) 服务链路追踪...

0、前言微服务架构上众多微服务通过REST调用,可能需要很多个服务协同才能完成一个接口功能,如果链路上任何一个服务出现问题或者网络超时,都会形成导致接口调用失败。随着业务的不断扩张,服务之间互相调用会越来越复杂。如何清晰地…

opengl模板缓冲区

相信大家有些人对opengl的模板缓冲区不是很理解,包括我最开始也是,opengl的模板缓冲区其实就是采用过滤的技术来控制那些颜色可以绘制,那些不能进行绘制。这里的过滤技术也就是我们的一个控制方法,主要体现在如下两个函数glStenci…

vue在java中的应用_开发知识-Vue篇:在Vue应用中集成O2OA

在前面的章节中,我们介绍了两种在O2OA中使用Vue开发应用的方式,已经可以满足绝大多数的情况了。如果您考虑完全脱离O2的web服务器,自己搭建web服务器,那就请阅读本章。我们还是使用Vue的Vue-CLI工具,创建Vue应用&#…

C++ 虚函数在基类与派生类对象间的表现及其分析

近来看了侯捷的《深入浅出MFC》,读到C重要性质中的虚函数与多态那部分内容时,顿时有了疑惑。因为书中说了这么一句:使用“基类之指针”指向“派生类之对象”,由该指针只能调用基类所定义的函数,如果要让基类的指针使用…

php评论盖楼怎么实现,dedecms评论盖楼实现楼层数,类似腾讯、网易的评论(5.5/5.6版)...

DEDE评论效果:修改后的效果:修改步骤一、织梦dedecms5.5版本(5.6版本请往下看)1、修改/plus/feedback_ajax.php文件的第131行(如果你没改过)下面是修改之前的代码:$qmsg {quote}{title}.$row[username]. 的原帖:{/title}{content…

datagridview绑定与详细说明 (搜集)

1、实现一个用于处理数据库教程数据检索的详细信息的方法。 下面的代码示例实现一个 getdata 方法,该方法对一个 sqldataadapter 组件进行初始化,并使用该组件填充 datatable。 然后,将 datatable 绑定到 bindingsource 组件。请确保将 conne…

matlab显示二值直方图,图像灰度变换、二值化、直方图

1、灰度变换1)灰度图的线性变换Gnew Fa * Gold Fb。Fa为斜线的斜率,Fb为y轴上的截距。Fa>1 输出图像的对比度变大,否则变小。Fa1 Fb≠0时,图像的灰度上移或下移,效果为图像变亮或变暗。Fa-1,Fb255时,发…

blender怎么移动骨骼,Blender学习笔记-(015)创建骨骼绑定及权重绘制操作详解

骨骼创建绑定具体操作如下:1: 【ShiftA】创建基础骨骼。(也可以通过打开Blender的插件Rigging:Rigify,生成自定义骨骼)2:点击骨骼,按【Tab】键进入编辑模式,选中创建骨骼端,按【E】拖…

[MySQL binlog实战] 增量同步与数据搜索~从入门到精通

学习基础知识,并落实到实际场景(增量同步数据搜索) 对基础知识不感兴趣的,可以直接跳到应用场景 文章目录 binlog是什么简介产生方式文件格式statementrowmixed 怎么办开启 binlog查看 binlog其他查看相关命令运维查看 binlog设置…