java.lang.Class 类
java.lang.Class 类是实现反射的关键所在,Class 类的一个实例表示 Java 的一种数据类型,包括类、接口、枚举、注解(Annotation)、数组、基本数据类型和 void。Class 没有公有的构造方法,Class 实例是由 JVM 在类加载时自动创建的。
public class ReflectionTest01 {public static void main(String[] args) {// 获得Class实例// 1.通过类型class静态变量Class clz1 = String.class;String str = "Hello";// 2.通过对象的getClass()方法Class clz2 = str.getClass();// 获得int类型Class实例Class clz3 = int.class;// 获得Integer类型Class实例Class clz4 = Integer.class;System.out.println("clz2类名称:" + clz2.getName());System.out.println("clz2是否为接口:" + clz2.isInterface());System.out.println("clz2是否为数组对象:" + clz2.isArray());System.out.println("clz2父类名称:" + clz2.getSuperclass().getName());System.out.println("clz2是否为基本类型:" + clz2.isPrimitive());System.out.println("clz3是否为基本类型:" + clz3.isPrimitive());System.out.println("clz4是否为基本类型:" + clz4.isPrimitive());}
}
//clz2类名称:java.lang.String
//clz2是否为接口:false
//clz2是否为数组对象:false
//clz2父类名称:java.lang.Object
//clz2是否为基本类型:false
//clz3是否为基本类型:true
//clz4是否为基本类型:false
java.lang.reflect 包
java.lang.reflect 包提供了反射中用到类,主要的类说明如下:
Constructor 类:提供类的构造方法信息。
Field 类:提供类或接口中成员变量信息。
Method 类:提供类或接口成员方法信息。
Array 类:提供了动态创建和访问 Java 数组的方法。
Modifier 类:提供类和成员访问修饰符信息。
public class ReflectionTest02 {public static void main(String[] args) {try {// 动态加载xx类的运行时对象Class c = Class.forName("java.lang.String");// 获取成员方法集合Method[] methods = c.getDeclaredMethods();// 遍历成员方法集合for (Method method : methods) {// 打印权限修饰符,如public、protected、privateSystem.out.print(Modifier.toString(method.getModifiers()));// 打印返回值类型名称System.out.print(" " + method.getReturnType().getName() + " ");// 打印方法名称System.out.println(method.getName() + "();");}} catch (ClassNotFoundException e) {System.out.println("找不到指定类");}}
}
Constructor类的常用方法
通过 java.lang.reflect.Modifier 类可以解析出 getMocMers() 方法的返回值所表示的修饰符信息。在该类中提供了一系列用来解析的静态方法,既可以查看是否被指定的修饰符修饰,还可以字符串的形式获得所有修饰符。
Modifier类的常用方法
int modifiers = con.getModifiers(); // 获取构造方法的修饰符整数
boolean isPublic = Modifier.isPublic(modifiers); // 判断修饰符整数是否为public
string allModifiers = Modifier.toString(modifiers);
Method 类的常用方法
public class Book1 {// static 作用域方法static void staticMethod() {System.out.println("执行staticMethod()方法");}// public 作用域方法public int publicMethod(int i) {System.out.println("执行publicMethod()方法");return 100 + i;}// protected 作用域方法protected int protectedMethod(String s, int i) throws NumberFormatException {System.out.println("执行protectedMethod()方法");return Integer.valueOf(s) + i;}// private 作用域方法private String privateMethod(String... strings) {System.out.println("执行privateMethod()方法");StringBuffer sb = new StringBuffer();for (int i = 0; i < sb.length(); i++) {sb.append(strings[i]);}return sb.toString();}
}
输入输出流
输入就是将数据从各种输入设备(包括文件、键盘等)中读取到内存中,输出则正好相反,是将数据写入到各种输出设备(比如文件、显示器、磁盘等)。
数据流是 Java 进行 I/O 操作的对象,它按照不同的标准可以分为不同的类别。
1、按照流的方向主要分为输入流和输出流两大类。
2、数据流按照数据单位的不同分为字节流和字符流。
3、按照功能可以划分为节点流和处理流。
系统流对应的类为 java.lang.System
System.in:标准输入流,默认设备是键盘。
System.out:标准输出流,默认设备是控制台。
System.err:标准错误流,默认设备是控制台。
File类
public class Test02 {public static void main(String[] args) {String path = "C:/windows/"; // 指定文件所在的目录File f = new File(path, "notepad.exe"); // 建立File变量,并设定由f变量引用System.out.println("C:\\windows\\notepad.exe文件信息如下:");System.out.println("============================================");System.out.println("文件长度:" + f.length() + "字节");System.out.println("文件或者目录:" + (f.isFile() ? "是文件" : "不是文件"));System.out.println("文件或者目录:" + (f.isDirectory() ? "是目录" : "不是目录"));System.out.println("是否可读:" + (f.canRead() ? "可读取" : "不可读取"));System.out.println("是否可写:" + (f.canWrite() ? "可写入" : "不可写入"));System.out.println("是否隐藏:" + (f.isHidden() ? "是隐藏文件" : "不是隐藏文件"));System.out.println("最后修改日期:" + new Date(f.lastModified()));System.out.println("文件名称:" + f.getName());System.out.println("文件路径:" + f.getPath());System.out.println("绝对路径:" + f.getAbsolutePath());}
}
/**
C:\windows\notepad.exe文件信息如下:
============================================
文件长度:193536字节
文件或者目录:是文件
文件或者目录:不是目录
是否可读:可读取
是否可写:可写入
是否隐藏:不是隐藏文件
最后修改日期:Mon Dec 28 02:55:19 CST 2016
文件名称:notepad.exe
文件路径:C:\windows\notepad.exe
绝对路径:C:\windows\notepad.exe
*/
public class Test03 {public static void main(String[] args) throws IOException {File f = new File("C:\\test.txt"); // 创建指向文件的File对象if (f.exists()) // 判断文件是否存在{f.delete(); // 存在则先删除}f.createNewFile(); // 再创建}
}
查找文件
File 类的 list() 方法提供了遍历目录功能
public class Demon {public static void main(String[] args) {File f = new File("C:/"); // 建立File变量,并设定由f变量变数引用System.out.println("文件名称\t\t文件类型\t\t文件大小");System.out.println("===================================================");String fileList[] = f.list(); // 调用不带参数的list()方法for (int i = 0; i < fileList.length; i++) { // 遍历返回的字符数组System.out.print(fileList[i] + "\t\t");System.out.print((new File("C:/", fileList[i])).isFile() ? "文件" + "\t\t" : "文件夹" + "\t\t");System.out.println((new File("C:/", fileList[i])).length() + "字节");}}
}
创建和删除文件
File 类不仅可以获取已知文件的属性信息,还可以在指定路径创建文件,以及删除一个文件。创建文件需要调用 createNewFile() 方法,删除文件需要调用 delete() 方法。无论是创建还是删除文件通常都先调用 exists() 方法判断文件是否存在。
public class Test03 {public static void main(String[] args) throws IOException {File f = new File("C:\\test.txt"); // 创建指向文件的File对象if (f.exists()) // 判断文件是否存在{f.delete(); // 存在则先删除}f.createNewFile(); // 再创建}
}
创建和删除目录
File 类除了对文件的创建和删除外,还可以创建和删除目录。创建目录需要调用 mkdir() 方法,删除目录需要调用 delete() 方法。无论是创建还是删除目录都可以调用 exists() 方法判断目录是否存在。
public class Test04 {public static void main(String[] args) {String path = "C:/config/"; // 指定目录位置File f = new File(path); // 创建File对象if (f.exists()) {f.delete();}f.mkdir(); // 创建目录}
}