什么是反射
我们都知道java创建一个对象,new 一个就好了,那么我们如果在编写代码时不知道我们要用什么怎么办,那么这时候反射就派上用场了。反射就是在代码运行时动态的获取方法和属性。
最具代表性的就是框架,spring框架大量使用了反射,具体可以看看spring的bean源码。
反射创建对象
反射创建对象有三种方式
- 第一种:类.Class方法
Class<String> strClass1 = String.class;
String str1 = strClass1.getConstructor().newInstance();
- 第二种:对象.getClass()方法
String str = new String();
String str2 = str.getClass().getConstructor().newInstance();
- 第三种:Class.forName(“包名.类名”)-------推荐用这个
Class<?> strClass3 = Class.forName("java.long.String");
String str3 = (String)strClass3.getConstructor().newInstance();
反射获取属性和方法
获取构造方法 | 作用 |
---|
getConstructors() | 获取public构造方法,获取不到父类的public |
getDeclaredConstructors() | 获取所有构造方法,包括private |
getConstructor() | 获取指定public构造方法 |
getDeclaredConstructor() | 获取指定private构造方法 |
获取类属性 | 作用 |
---|
getFields() | 获取所有public字段,父类的也可以 |
getDeclaredFields() | 获取所有字段,包括private |
getField() | 获取指定public字段 |
getDeclaredField() | 获取指定private字段 |
获取类属性 | 作用 |
---|
getMethods() | 获取所有public方法,父类的pubic也可以获取到 |
getDeclaredMethods() | 获取所有方法 ,包括private |
getMethod() | 获取指定public字段 |
getDeclaredMethod() | 获取指定private字段 |
反射获取字段和赋值
Class c=Class.forName("com.aa.commons.models.cln.ClnUser");
System.out.println("类名:"+c.getSimpleName());
System.out.println("类的包名:"+c.getPackage());
System.out.println("================使用获取到的字段=================");
Object object= c.getConstructor().newInstance();
Field field1=c.getField("name");
field1.set(object,"ljj");
System.out.println("-----------------"+field1.getName()+"-------------");
System.out.println("name字段的值:"+field1.get(object));
System.out.println("name字段类型:"+field1.getType());
System.out.println("name字段修饰符:"+field1.getModifiers());
Field field2=c.getDeclaredField("sex");
field2.setAccessible(true);
field2.set(object,"男");
System.out.println("-----------------"+field2.getName()+"-------------");
System.out.println("loginName字段的值:"+field2.get(object));
System.out.println("loginName字段类型:"+field2.getType());
System.out.println("loginName字段修饰符:"+field2.getModifiers());
动态代理见下节分晓