对象有编译类型和运行类型
Person man=new Man();
编译类型 Person 运行类型Man
获取Class实例的方法Class的实例就是类的字节码
(一个类在虚拟机中只有一份字节码)
1,Class clazz1=Animal.class;
2, Class<Person>clazz=(Class<Person>) Class.forName("com.m01.reflect.Person");
3,Person man=new Man();
Classman.getClass();
基本数据类型
byten short char int long float double boolean void
int.class,void.class
一,获取类的构造器
@Test public void test() throws Exception { Class clz=Class.forName("com.m01.reflect.Dog"); Constructor[]csAll=clz.getConstructors();//获取所有public的构造器, csAll=clz.getDeclaredConstructors();//获取本类的所有构造器 Constructor c=clz.getConstructor(null);//获取指定参数类型的public的构造器 c=clz.getDeclaredConstructor(null);//获取指定参数类型的构造器 //调用构造器,实例化对象 c.setAccessible(true);//针对private的属性 进行强制执行(实例化对象) Dog dog=(Dog) c.newInstance(null); dog.doWork(); }
二,获取类的方法
@Test public void testMethod() throws Exception { Class clz=Class.forName("com.m01.reflect.Dog"); Method[]methods=clz.getMethods();//获取所有的public类型的方法包括父类的方法 methods=clz.getDeclaredMethods();//只获取本类中所有的方法 Method method=clz.getMethod("doWork", null);//获取所有的满足参数列表的public类型的方法包括父类的方法 method=clz.getDeclaredMethod("sing", null);//只获取本类中满足参数列表所有的方法 //调用方法,实例化对象
method=clz.getDeclaredMethod("ooxx", String[].class);//调用有可变参数的方法
method.invoke(clz.newInstance(), new Object[]{new String[]{"大桥","潘金莲"}});
method.setAccessible(true); method.invoke(clz.newInstance(), null); System.out.println(method.toString()); for(Method m :methods){ System.out.println(m.toString()); } }
三,反射字段
@Test public void testField() throws Exception{ Class clz=Class.forName("com.m01.reflect.Dog"); Field[]fields=clz.getFields();//获取所有的public类型的属性包括父类的属性 fields=clz.getDeclaredFields();//只获取本类中所有的属性 Field field=clz.getField("manName");//获取所有的public类型的包括父类在内的指定属性 field=clz.getDeclaredField("dogName");//获取本类中指定的属性 //使用类的属性 field.setAccessible(true);//强制忽略属性的private Object obj=clz.newInstance(); field.set(obj, "大花花");//给属性分配所属对象和值 Object value=field.get(obj);//通过对象获取该字段的值 System.out.println(value); System.out.println(obj.toString()); System.out.println(field.getType()); System.out.println(field); System.out.println(Arrays.asList(fields)); }
四,其他的API
Class类中: int getModifiers():获得修饰符 String getName():返回类的全限定名
Package getPackage():获得该类的包 String getSimpleName():获得类的简单名字
Class getSuperclass():获得类的父类 boolean isArray():判断该Class实例是否是数组
boolean isEnum() :判断该Class实例是否是枚举
五,读取项目中文件的方法
1,把路径写死
@Test public void testReadFile1() throws Exception{ //1绝对路径 String fileName="C:\\eclipseprograms\\program2\\javacollections\\src\\db.properties"; Properties pro=new Properties(); InputStream ins=new FileInputStream(fileName); pro.load(ins); System.out.println(pro); }
2,相对路径
@Test public void testReadFile2() throws Exception{ //相对路径,使用ClassLoader类的静态方法 Properties pro=new Properties(); InputStream ins=ClassLoader.getSystemResourceAsStream("db.properties"); pro.load(ins); System.out.println(pro); }
@Test public void testReadFile3() throws Exception{ //相对路径,通过反射获取ClassLoader的实例 Properties pro=new Properties(); Class clz=Class.forName("com.m01.reflect.Dog"); ClassLoader loader=clz.getClassLoader(); InputStream ins=ClassLoader.getSystemResourceAsStream("db.properties"); ins=loader.getResourceAsStream("db.properties"); pro.load(ins); System.out.println(pro); }
@Test public void testReadFile4() throws Exception{ //相对路径,通过当前线程获取ClassLoader的实例 Properties pro=new Properties(); Class clz=Class.forName("com.m01.reflect.Dog"); ClassLoader loader=clz.getClassLoader(); InputStream ins=ClassLoader.getSystemResourceAsStream("db.properties"); ins=loader.getResourceAsStream("db.properties"); ins=Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"); pro.load(ins); System.out.println(pro); }