一:介绍
Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言。
Java 可运行于多个平台,如 Windows, Mac OS 及其他多种 UNIX 版本的系统。Java语言编写的程序,在一次编译后,可以在多个系统平台上运行。
主要特性:
- Java 语言是简单的:
- Java 语言的语法与 C 语言和 C++ 语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java 丢弃了 C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java 语言不使用指针,而是引用。并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧。
- Java 语言是面向对象的:
- Java 语言提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为 implements)。Java 语言全面支持动态绑定,而 C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。
- Java语言是分布式的:
- Java 语言支持 Internet 应用的开发,在基本的 Java 应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括 URL、URLConnection、Socket、ServerSocket 等。Java 的 RMI(远程方法激活)机制也是开发分布式应用的重要手段。
- Java 语言是健壮的:
- Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证。对指针的丢弃是 Java 的明智选择。Java 的安全检查机制使得 Java 更具健壮性。
- Java语言是安全的:
- Java通常被用在网络环境中,为此,Java 提供了一个安全机制以防恶意代码的攻击。除了Java 语言具有的许多安全特性以外,Java 对通过网络下载的类具有一个安全防范机制(类 ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类 SecurityManager)让 Java 应用设置安全哨兵。
- Java 语言是体系结构中立的:
- Java 程序(后缀为 java 的文件)在 Java 平台上被编译为体系结构中立的字节码格式(后缀为 class 的文件),然后可以在实现这个 Java 平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。
二:反射
1、什么是反射?
反射是 java 中重要的一个只是模块,其是框架设计的灵魂,基本上所有的框架都是使用反射机制来实现的。
将类的各个组成部分封装为其他对象,这就是反射机制。
2、反射的优点
- 可以在程序运行过程中,操作这些对象
- 可以解耦,提高程序的可扩展性
3、获取Class对象的方式
- Class.forName("全类名"):将字节码文件加载进内存,返回 Class 对象(多用于配置文件)
- 类名.class:通过类名的属性 class 获取(多用于传参的构造)
- 对象.getClass():该方法定义于Object中(多用于对象的获取字节码方式)
注意:同一个字节码文件,在以上三种方式中,获取的 class 对象都是同一个。
package cn.reflectTest;
public class reflectTest {
public static void main(String[] args) throws Exception {
// 1.通过class.forName获取
Class cls1 = Class.forName("cn.reflectTest.reflectClass");
// 2.直接用类名.clss获取
Class cls2 = reflectClass.class;
// 3.使用对象获取
reflectClass obj = new reflectClass();
Class cls3 = obj.getClass();
}
}
4、Class 对象功能:
- 获取成员变量们:
- getFields():获取所有使用publi修饰的成员变量,返回 Field[]
- getField(String name):获取使用public修饰的指定成员变量,返回 Field
- getDeclaredFields():获取所有的成员变量,返回 Field[]
- getDeclaredField(String name):获取指定成员变量。返回 Field
- 获取构造方法们:
- getConstructors():返回 Construct<?>[]
- getConstruct(类<?>...parameterTypes):返回 Construct<T>
- getDeclaredConstructs():返回 Construct<?>[]
- getDeclaredConstruct(类<?>...parameterTypes):返回 Construct<T>
- 获取成员方法们:
- getMethods():获取所有使用publi修饰的成员方法,返回 Method[]
- getMethod(String name,类<?>...parameterTypes):获取使用public修饰的指定成员方法,返回 Method
- getDeclaredMethods():获取所有的成员方法,返回 Method[]
- getDeclaredMethod(String name,类<?>...parameterTypes):获取指定成员方法。返回 Method
- 获取类名:
- getName():返回 String
备注:暴力反射:setAccessible() 忽略访问权限符的安全检查
5、案例
要求:写一个框架,可以创建任意类的对象,并且执行其中的任意方法
1)目录如下
2)配置文件 pro.properties 中代码如下
className=
methodName=
3)Person 和 Student 代码如下
package cn.cats.doMain;
public class Person {
public void eat(){
System.out.println("eat...");
}
}
package cn.cats.doMain;
public class Student {
public void sleep(){
System.out.println("sleep...");
}
}
4)框架类 ReflectTest 代码如下
package cn.cats.doMain;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
/**
* 框架类
*/
public class ReflectTest {
public static void main(String[] args) throws Exception {
// 创建任意类对象,执行任意方法
// 1.加载配置文件
// 1.1创建pro对象
Properties pro = new Properties();
// 1.2加载配置文件,转换为一个集合
// 1.2.1获取class目录下的配置文件
ClassLoader classLoader = ReflectTest.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("pro.properties");
System.out.println(classLoader);
pro.load(is);
// 2.获取配置文件中定义的数据
String className = pro.getProperty("c1assName");
String methodName = pro.getProperty ( "methodName" );
// 3.加载该类进内存
Class cls = Class.forName(className) ;
//4.创建对象
Object obj = cls.newInstance();
//5.获取方法对象
Method method = cls.getMethod (methodName) ;
//6.执行方法
method.invoke(obj);
}
}
三:结尾
通过反射的学习,虽然在实际开发中使用较少,但是当需要自己写一些框架的时候,这是必须要用到的知识。因此反射是 java 中非常重要的一部分,好啦本文就到此为止啦,希望能够对各位小伙伴有所帮助哦。