反射1
反射的概念
反射能实现的功能
Class类详解
反射的概念
Reflection,它是一种在程序运行时可以将其状态作为数据进行查询与修改的能力。
java语言对查询支持更好,别的语言也支持反射。java对修改支持不是很好。
反射能实现的功能
有类名,可以获取:
有引用,可以
Class类详解
反射的核心
该类来自java.lang包,而且是一个泛型类
在运行时可以使用它发现类的所有信息
一个jvm中每一个加载的类只会有一个Class对象
获取Class的实例
类的class静态属性(字面量)
实例的getClass()方法
使用其静态方法forName()方法
package java20180205_2; class User { static { System.out.println("user init ..."); } } public class ReflectionDemo1 { static void create1() { new User(); } static void create2() { Class<User> c = User.class; } static void create3() { try { Class c = Class.forName("java20180205_2.User"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } static void create4() { try { Class c = Class.forName("java20180205_2.User", false, ReflectionDemo1.class.getClassLoader()); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static void main(String[] args) { create4(); /** * 第一种方法 */ Class<String> c1 = String.class; /** * 第二种方法 */ String s = ""; Class<?> c2 = s.getClass(); /** * 第三种方法 */ try { Class<?> c3 = Class.forName("java.lang.String"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
反射2
获取包的信息
获取类的信息
获取属性的信息
获取包的信息
java.lang.Package
String getName()
static Package getPackage(String name)
static Package[] getpackage()
获取属性的信息
java.lang.reflect.Field
Field[] getFields()//得到的是所有的public属性
Field[] getDeclaredFields()//得到所有但不包括继承而来的
Field getField(String name)
Field getDeclaredField(String name)
获取包及类信息
package java20180205_2; import java.io.Serializable; import java.lang.reflect.Modifier; abstract class Person extends Thread implements Serializable,Runnable{ } public class PackageInfo { public static void main(String[] args) { // // Package p=Package.getPackage("java.lang"); // System.out.println(p.getName()); Package[] ps=Package.getPackages(); for (Package p1 : ps) { System.out.println(p1.getName()); } System.out.println("============================"); Class<Person> c1=Person.class; //下面是全限定名 System.out.println(c1.getName()); //下面只有类名 System.out.println(c1.getSimpleName()); System.out.println(c1.getPackage().getName()); System.out.println(c1.isPrimitive()); System.out.println(c1.isInterface()); System.out.println(int.class.isPrimitive()); System.out.println("============================"); //得到类本身的信息及父类和父接口的信息 Class<?> sc=c1.getSuperclass(); System.out.println(sc.getName()); Class<?>[] sc1=c1.getInterfaces(); for (Class<?> class1 : sc1) { System.out.println(class1.getName()); } System.out.println("============================"); // int mod=c1.getModifiers(); int mod=Serializable.class.getModifiers(); System.out.println(Modifier.toString(mod)); System.out.println(c1.toGenericString()); } }
获取字段信息
package java20180205_2; import java.lang.reflect.Field; interface interface1{ int NUM=10; } class class1{ int num1; public String name; } class MyClass extends class1 implements interface1{ int num2; public int num3; private int num4; } public class FieldInfo { public static void main(String[] args) { Class<MyClass> c=MyClass.class; Field[] fields=c.getFields(); for (Field field : fields) { System.out.println(field.getName()); } System.out.println("==================="); Field[] fields2=c.getDeclaredFields(); for (Field field : fields2) { System.out.println(field.getName()); } System.out.println("==================="); try { Field field3=c.getField("NUM1"); } catch (NoSuchFieldException | SecurityException e) { e.printStackTrace(); } System.out.println("==================="); try { Field field4=c.getDeclaredField("num2"); } catch (NoSuchFieldException | SecurityException e) { e.printStackTrace(); } } }
反射3
获取方法的信息
获取构造方法的信息
java.lang.reflect.Method
Method[] getMethods()
Method[] getDeclaredMethods()
Method getMethod(String name,Class... parameterTypes)
Method getDeclaredMethod(String name,Class... parameterTypes)
package java20180205_2; import java.lang.reflect.Constructor; import java.lang.reflect.Method; abstract class Class2{ public Class2(){ } public void m1(){ } public void m1(int num,String str){ } void m2(){ } static void m3(){ } abstract void m4(); } public class MethodInfo { public static void main(String[] args) { Class<Class2> c1=Class2.class; //得到这个类中所有public的方法,默认的与private的都不行 Method[] m1=c1.getMethods(); for (Method method : m1) { System.out.println(method.getName()); } System.out.println("=============="); //得到这个类中所有声明的方法 Method[] m2=c1.getDeclaredMethods(); for (Method method : m2) { System.out.println(method.getName()); } System.out.println("=============="); try { // Method c2=c1.getDeclaredMethod("m1"); // Method c2=c1.getDeclaredMethod("m1",int.class); Method c2=c1.getDeclaredMethod("m1",int.class,String.class); System.out.println(c2.getName()); } catch (NoSuchMethodException | SecurityException e) { e.printStackTrace(); } System.out.println("=============="); Constructor<?>[] c3=c1.getConstructors(); for (Constructor<?> constructor : c3) { System.out.println(constructor.getName()); System.out.println(constructor.getModifiers()); } } }
反射4
通过反射创建对象
调用对象的方法
调用对象的属性