简介
接着第四章第3节内部类的内容,这一节开始学习Class类、Jar文件👇:
一、Class类
1.1定义
关于Java的类在前面第2章第1节已经提到过,要是不够了解的可以戳回去看👉Java类
1.2Class类的特点
java.lang 包中的类,该类的实例用来封装对象运行时的状态。
Class 类本身不提供构造方法,因此, 不能使用 new 运算符和构造方法显式地创建一个 Class 对象 。当一个 类被加载且创建对象 时,和该类相关的一个类型为 Class 的对象就会 自动创建。
任何对象调用 getClass () 方法都可以获取和该对象相关的一个 Class 对象,这个 Class 对象可以获取 所属类的有关信息。
如:
String s = "Hello!";
Class c = s.getClass();
针对对象c,可以有如下操作:
c.getDeclaredMethods() //获取String类的方法列表
c.getFields() //获取String类的成员列表
c.isInterface() //判断String是否是接口
……
实际使用中👇:
public class Main {
public static void main(String[] args) {
String s = "Hello!";
Class c = s.getClass();
System.out.println(c.getDeclaredMethods()); //获取String类的方法列表
System.out.println(c.getFields()); //获取String类的成员列表
System.out.println(c.isInterface()); //判断String是否是接口
}
}
结果为:
1.3使用Class实例化一个对象
除了使用 new 运算符和构造方法去创建一个对象,也可以使用 Class 对象得到一个类的实例
首先,通过 Class 类的 forName () 方法,能够根据类名(字符串类型)获取该类的 Class 对象:
public static Class forName ( String className ) throws ClassNotFoundException
然后,调用 Class 对象的 newInstance () 方法可以获取该类的一个实例:
public Object newInstance () throws InstantiationException,IllegalAccessException
例如:已经定义了“ Kitty” 类,那么可以通过 Class 类创建 Kitty 类的对象:
①
class Kitty extends Pet{
public void speak(){
System.out.println("喵喵~");
}
}
②
Class c = Class.forName(“Main.Kitty");//获取Kitty类相关的Class对象
Pet a = (Pet) c.newInstance();//得到Pet类的实例“a”
//(Pet)-使用下转型
a.speak();
1.4使用Class实例化一个对象的注意要点:
“ newInstance ()” 方法返回 Object 类型,因此要 下转型
使用“ forName ()” 和“ newInstance ()” 方法时,要使用“ throws” 抛出异常
如:
Kitty getAKitty () throws ClassNotFoundException , InstantiationException ,
IllegalAccessException {
Class c = Class.forName("Kitty");
Kitty a = (Kitty)c.newInstance();
return a;
}
1.5反编译和文档生成器
反编译器:javap.exe可以将字节码反编译为源码,查看源码类中的方法名字和成员变量的名字 ,例如:
假设D:目录下有People.class文件,则:
D:\>javap People
文档生成器:javadoc.exe可以制做源文件类结构的html格式文档。
假设D:目录下有People.java文件,则:
D:\>javadoc –d d:\readme People.java
二、Jar文件
2.1Jar文件定义
JAR文件是Java特有的一种文档格式
可以使用jar.exe命令把一些类的字节码文件压缩成一个jar文件,然后将这个jar文件存放到Java运行环境的扩展中,即将该jar文件存放在JDK安装目录的jre\lib\ext文件夹中。这样,Java应用程序就可以使用这个jar文件中的类来创建对象了。
2.2有包名的类
下列TestOne和TestTwo类的包名为moon.star。
TestOne.java👇:
package moon.star;
public class TestOne{
public void fTestOne(){
System.out.println(“I am a
method In TestOne class”);
}
}
TestTwo.java👇:
package moon.star;
public class TestTwo{
public void fTestTwo(){
System.out.println(“I am a
method In TestTwo class”);
}
}
比如将这两个源文件保存到d:\1000\moon\star 目录中,然后分别编译这两个源文件。
将生成的两个字节码文件TestOne.class和TestTwo.class压缩成一个jar文件:Jerry.jar。
首先编写一个清单文件:hello.mf(manifestfiles)。
hello.mf
Manifest-Version: 1.0
Class: moon.star.TestOne moon.star.TestTwo
Created-By: 1.6
将hello.mf保存到d:\1000 目录中。
使用jar命令来生成一个jar文件:Jerry.jar。
d:\1000>jar cfm Jerry.jar hello.mf moon\star\TestOne.class
moon\star\TestTwo.class
如果D:\1000\moon\star只有以上两个字节码文件,可以
d:\1000>jar cfm Jerry.jar hello.mf moon\star\*.class
将Jerry.jar复制到到Java运行环境的扩展中,即JDK安装目录的jre\lib\ext文件夹中。
在其他类中就可以使用import语句引入Jerry.jar中的类。
import moon.star.*;
public class Use{
public static void main(String args[]){
TestOne a=new TestOne();
a.fTestOne();
TestTwo b=new TestTwo();
b.fTestTwo();
}
}
2.3无包名的类
如果TestOne和TestTwo没有包名,只需要将TestOne.java和TestTwo.java保存到d:\1000中,编译得到字节码文件。将上述清单文件中类的包名去掉后保存到d:\1000文件夹中,使用jar命令
d:\1000>jar cfm Jerry.jar hello.mf TestOne.class TestTwo.class
或
d:\1000>jar cfm Jerry.jar hello.mf *.class
将Jerry.jar复制到到Java运行环境的扩展中,即JDK安装目录的jre\lib\ext文件夹中,应用程序就可以直接使用(无需import语句)Jerry.jar文件中的TestOne.class和TestTwo.class。
三、总结
第4章的内容就到这里了,一共有这些内容:
接口
接口的成员默认的修饰关键字;接口回调
内部类
被外嵌类独有;不能定义类成员和类方法
匿名类
异常类
抛出异常;捕获异常;处理异常
Class 类
Jar 文件
结束语:
以上是Jav第四章的全部内容,希望大家喜欢