JAVA SE基础笔记 (5)

JAVA SE基础笔记

GUI

GUI:图片界面显示

CUI:命令行操作

网络编程 什么是网络编程

网络编程就用来实现网络互连的不同计算机运行的程序间的数据交换。

反射 什么是类的加载

类的加载:当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。

加载就是将class文件读入内存,并为之创建一个Class对象。任何类被使用时系统都会创建一个Class对象。

连接分为验证,准备,解析三步,验证是否有正确的内部结构。准备则是负责为类的静态成员分配内存,并设置默认初始化值。解析是将类的二进制数据中的符合引用替换为直接引用(将等号替换为地址值指向引用?)。

初始化就是通过new创建类的实例,进行初始化。

什么时候会进行类的加载

类加载的时机:

创建类的实例

访问类的静态变量,或者为静态变量赋值

调用类的静态方法

初始化某个类的子类

直接使用java.exe命令来运行某个主类

使用反射方式强制创建某个类或接口对应的java.lang.Class对象

什么是类加载器

类加载器:负责将class文件加载到内存中,并为之生成对应的Class对象。

类加载器的组成:

根类加载器——也成为引导类加载器,负责java核心类的加载。(System String等,在jdk的lib中的rt.jar中)

扩展类加载器——负责jre的扩展目录jar包的加载。(在jdk中lib的ext目录下)

系统类加载器——负载在jvm启动时加载来自java命令的class文件,还有classpath环境变量所指定的jar包和类路径。

什么是反射机制

反射(reflection):是指在运行状态中,对任意一个类,都能知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。(原来我们使用构造方法、成员变量、成员方法都是在.java文件中操作的,现在则是通过.class文件去使用,那我们首先需要得到.class文件的对象,也就是Class对象

如何获取Class对象

演示Person类:

package itshuai.com; public class Person { private String name; int age; public String address; public Person() { } private Person(String name, int age){ this.name = name; this.age = age; } public Person(String name,int age,String address) { this.name = name; this.age = age; this.address = address; } public void show() { System.out.println("show方法执行了"); } private void method(String s) { System.out.println("method"+s); } public String getString(String s,int i) { return s+"________"+i; } private void function() { System.out.println("function"); } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", address=" + address + "]"; } }

获取Class文件对象有三种方法:

Object类的getClass()方法

数据类型的静态属性class

Class类中的静态方法

package itshuai.com; public class Reflection { public static void main(String[] args) throws ClassNotFoundException { //已经创建好了一个Person Person per = new Person(); Class reflection1 = per.getClass(); System.out.println(reflection1); //第二种 Class reflection2 = Person.class; System.out.println(reflection2); //第三种(适用于开发,因为字符串的名字可以写在配置文件中) Class reflection3 = Class.forName("itshuai.com.Person"); System.out.println(reflection3); } } 如何使用Class对象

通过反射来创建对象(使用Class对象来获取能够表示类的构造方法信息的Constructor对象,并使用这个能表示Person类的构造方法的对象来创建Person的对象并调用其方法):

package itshuai.com; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class Reflection { public static void main(String[] args) throws Exception { //通过类的字符串名称来获取对应的Class对象 Class per = Class.forName("itshuai.com.Person"); //这是获取所有的公共构造方法并存在数组中并遍历 //public Constructor<?>[] getConstructors() throws SecurityException Constructor[] cons = per.getConstructors(); for(Constructor con:cons) { System.out.println(con); } //这是获取所有的构造方法并存在数组中并遍历 //public Constructor<?>[] getDeclaredConstructors() throws SecurityException Constructor[] cons = per.getDeclaredConstructors(); for(Constructor con:cons) { System.out.println(con); } //获取单个公共的构造方法,注意参数为数据类型的Class对象,根据参数来决定获取哪个构造方法 //public Constructor<T> getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException,SecurityException Constructor con = per.getConstructor(String.class,int.class,String.class); //获取单个的构造方法 //使用此类对象表示的构造方法来创建对象。并调用方法 //public T newInstance(Object... initargs) throws InstantiationException,IllegalAccessException,IllegalArgumentException,InvocationTargetException Object pe = con.newInstance("陈帅",26,"衡水"); Person p = (Person)pe; p.show(); //获取单个私有的构造方法,通上面获取公共的构造方法格式一样 Constructor con = per.getDeclaredConstructor(String.class,int.class); //获取单个的构造方法,会报非法访问异常 //需要调用一个方法 con.setAccessible(true); //使用Constructor类表示的Person构造方法信息的对象来创建Person的对象并调用方法。 Object pe = con.newInstance("陈帅",26); Person p = (Person)pe; p.show(); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwzfzs.html