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…

css--block formatting context

block formatting context(块级格式化上下文) 如何产生BFC:当一个HTML元素满足下面条件的任何一点,都可以产生Block Formatting Context: float的值不为none。overflow的值不为visible。display的值为table-cell, table-caption, inline-bloc…

java自定义注解_Java自定义注解

Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚…

ios内购二次认证服务器代码

<?php// 获取认证结果的状态值 function get_status($arr) {while(list($key, $value) each($arr)) {if ($key "status") {return $value;}}return 10000; }// 认证 function verify($check_data, $is_sandbox 0) {$url "https://buy.itunes.apple.com/…

Java字符串压缩存储_java字符串压缩 - jeff1989的个人页面 - OSCHINA - 中文开源技术交流社区...

最近在做电信的一个用户套餐使用积量查询的接口&#xff0c;查询出的结构是一大段字符串。为了减小网络传输&#xff0c;故将字符串采用jdk自带的gzip和zip方法进行压缩。并用apache common 的base64进行压缩字符串的转码。base64的转码需要导入apache的codec包&#xff0c;不要…

android内存及内存溢出分析

一、 Android的内存机制 Android的程序由Java语言编写&#xff0c;所以Android的内存管理与Java的内存管理相似。程序员通过new为对象分配内存&#xff0c;所有对象在java堆内分配空间&#xff1b;然而对象的释放是由垃圾回收器来完成的。C&#xff0f;C中的内存机制是“谁污染…

java 通用方法_java 通用方法 代码

Class.forName("com.mysql.jdbc.Driver");String url"jdbc:mysql://localhost/bbs?userroot& passwordroot";Connection connDriverManager.getConnection(url);conn.setAutoCommit(false);String sql"insert into article values(null,?,?,no…

【原】UIView实现点击着重效果的解决方案

我们知道&#xff0c;在IOS中UIButton UIControl都有一个默认的选中效果&#xff0c;即点中后会图标会变暗&#xff0c;移开后又恢复正常。如何让UIView UIImageView等这些普通的view也实现同样的效果呢&#xff1f; 最近的一个项目里面&#xff0c;需要实现一个类似iPad/iPhon…

java oom产生原因_什么是OutOfMemoryError以及查找Java中OOM根本原因的步骤?

该OutOfMemoryError异常被抛出JVM&#xff0c;当JVM没有足够的可用内存&#xff0c;来分配。OutOfMemoryError在Exception类层次结构中属于Error类别。产生OutOfMemoryError我们将分配大量内存&#xff0c;这将耗尽堆内存的存储空间。我们将继续分配内存并达到目标&#xff0c;…

jquery在选择器中使用变量及innerText问题(转载)

转自&#xff1a;http://blog.csdn.net/shineall/article/details/7275449 最近在研究一个投票的小程序&#xff0c;写到获取每个作品的投票按钮及显示票数div的id时&#xff0c;遇到了点问题。 其中gid是一个变量&#xff0c;作为作品的唯一标识。 用dom动态更新当前票数写法如…

vs2010快捷键大全

CtrlE,D ----格式化全部代码 CtrlE,F ----格式化选中的代码 CTRL SHIFT B生成解决方案 CTRL F7生成编译 CTRL O打开文件 CTRL SHIFT O打开项目 CTRL SHIFT C显示类视图窗口 F4显示属性窗口 SHIFT F4显示项目属性窗口 CTRL SHIFT E显示资源视图 F12转到定义 CTRL F1…

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

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

java 某天为当年第几周_JAVA 日期 一个时间段总共几周,每一天星期几

/*** 查询一个时间段的总周数和查询当前时间是第几周*paramstart*paramend*return*/private int[] selectWeekNum(Date start,Date end,int week,intflag){java.util.Calendar nowjava.util.Calendar.getInstance();java.util.Calendar c_totaljava.util.Calendar.getInstance(…

Aixs2发布webservice服务

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

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

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

magento -- 修改文件来手动控制编译的开启和关闭

之前遇到一个情况&#xff0c;在编译开启的状态下安装了一个新插件&#xff0c;结果前后 台都不能访问了&#xff0c;这时想去找找是哪里在控制编译的开启和关闭&#xff0c;先把编译关了来保证系统不报错。按照一般的习惯后台数据或配置都是存在于数据库&#xff0c;但找遍数据…

鲶鱼java代码_实验一、求阶乘及计算数学常数E

一、实验目的1、掌握三种流程控制语法&#xff0c;并熟练应用2、了解Java的异常处理机制&#xff0c;会编写相应程序3、掌握方法重载的含义&#xff0c;并熟练应用二、实验内容&#xff1a;1、编写程序&#xff0c;计算n的阶乘(n&#xff01;)&#xff0c;n&#xff01;&#x…

Linux Shell 002-基础知识

Linux Shell 002-基础知识 本节关键字&#xff1a;Linux、Bash Shell、基础知识、Bash特性 相关指令&#xff1a;bash、rm、cp、touch、date 基础知识 什么是Shell脚本 简单概括&#xff1a;将需要执行的命令保存到文本中&#xff0c;按照顺序执行。 准备描述&#xff1a;sh…

java表达式的类型,Java如何确定三元条件运算符表达式的类型?

Can anyone explain this?public class Test {public static void main(String[] args) {char c A;int i 0;boolean b true;System.out.println(b ? c : i);System.out.println(b ? c : (char)i);System.out.println(b ? c : 0);System.out.println(b ? c : (char)0);}…