万事万物接对象,类也是对象(类类型),是java.lang.Class的对象。
1. 创建类类型的3种方法
package com.sun;
public class demo {
public static void main(String[] args) throws ClassNotFoundException {
//创建类类型
//1.通过类获得类类型
Class c1 = Foo.class;
//2.通过对象获得类类型
Foo foo = new Foo();
Class c2 = foo.getClass();
//3.通过对象的相对路径获得类类型
Class c3 = Class.forName("com.sun.Foo");
// 通过类类型创建类对象
Foo foo1 = (Foo) c1.newInstance();
}
}
class Foo {
}
2. 类类型方法
2.1 获取类信息方法
Class c = obj.getClass();//获取对象类类型
//获取类类型名称
String className = c.getName();
//类类型的方法
Method[] ms = c.getMethods();//获取类类型的方法集合
//Method中的方法
for(int i = 0; i < ms.length;i++){
//得到方法的返回值类型的类类型
Class returnType = ms[i].getReturnType();
String returnName = returnType.getName();
//得到方法的名称
String mothodName =ms[i].getName();
//获取参数类型--->得到的是参数列表的类型的类类型
Class[] paramTypes = ms[i].getParameterTypes();
for (Class class1 : paramTypes) {
String paramType = class1.getName();
}
}
2.2 获取类成员变量信息
/* Field类封装了关于成员变量的操作
* getFields()方法获取的是所有的public的成员变量的信息
* getDeclaredFields获取的是该类自己声明的成员变量的信息
*/
Field[] fs = c.getDeclaredFields();
for (Field field : fs) {
//得到成员变量的类型的类类型
Class fieldType = field.getType();
String typeName = fieldType.getName();
//得到成员变量的名称
String fieldName = field.getName();
}
2.3 获取类的构造函数信息
/*
* getConstructors获取所有的public的构造函数
* getDeclaredConstructors得到所有的构造函数
*/
Constructor[] cs = c.getDeclaredConstructors();
for (Constructor constructor : cs) {
//获取构造函数的参数列表--->得到的是参数列表的类类型
Class[] paramTypes = constructor.getParameterTypes();
}
2.4 获取&调用类类型的方法
- getMethod获取的是public的方法
- getDelcaredMethod自己声明的方法
//遗留问题?什么是Public方法什么是自己声明的方法,没有区别或重合吗?
//设A类有有多次重构的printf();方法。
A a= new A();
Class c = a.getClass();
Method m = c.getMethod("printf",int.class,int.class);//获取相应方法,方法名+参数的类类型
object obj = m.invoke(a,6,9);//通过反射调用类方法,对象+参数。
- 插播:控制台输入字符流
BufferedReader reader = new BufferedReader( new InputStreamReader(System.in));
System.out.println(reader.readLine());
静态加载类&动态加载类
- 静态加载类:编译时候加载的类
- 动态加载类:运行时候加载的类