이 기사에서는 특정 참조 가치가 있는 Java 리플렉션(코드 예제)에 대해 간략하게 소개합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
1. Class에 대한 간략한 소개
Class 클래스는 실행 중인 Java 애플리케이션의 클래스와 인터페이스를 나타냅니다. 열거형은 클래스이고, 주석은 인터페이스이며, 각 배열은 요소 유형과 차원이 동일한 모든 배열이 공유하는 클래스 객체로 반영되는 클래스에도 속합니다. 기본 Java 유형(boolean, byte, char, short, int, long, float 및 double)과 키워드 void도 클래스 객체로 표시됩니다.
jdk1.8 중국어 버전에서 발췌했습니다. 처음에는 이해하지 못할 수도 있습니다. 이제 한 문장씩 설명하겠습니다.
첫 번째 문장: 클래스가 로드된 후 JVM은 메모리에 해당 클래스의 Class 객체를 생성합니다.
두 번째 문장: 동일한 유형의 객체와 동일한 차원(길이에 관계 없음)의 배열은 메모리에서 동일한 Class 객체를 공유합니다.
세 번째 문장: 위의 기본 유형은 메모리에 클래스 객체도 갖습니다.
package com.dingyu; import org.junit.Test; /** * Class的简单使用方法 * * @author 70241 * */ public class ClassDemo { @Test public void classTest1() { try { Class class1 = Class.forName("com.dingyu.User");// 第一种获取Class对象的方法 User user = new User(); Class class2 = user.getClass();// 第二种获取Class对象的方法 Class class3=User.class;//第三种获取Class对象的方法 System.out.println("接下来判断到底同一类的不同对象的Class对象是不是同一个:" + (class1.hashCode() == class2.hashCode()&&class1.hashCode() == class3.hashCode())); } catch (ClassNotFoundException e) { e.printStackTrace(); } } @Test public void classTest2() { String[] s1 = new String[10]; String[] s2 = new String[30]; String[][] s3 = new String[3][30]; System.out.println(s1.getClass().hashCode()==s2.getClass().hashCode()); System.out.println(s1.getClass().hashCode()==s3.getClass().hashCode()); } }
package com.dingyu; import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import org.junit.Test; /** * Class的简单用法 * * @author dingyu * */ public class ClassDemo02 { @Test public void usingClass() throws Exception { Class userClass = Class.forName("com.dingyu.User"); // 获得类名 System.out.println(userClass.getName());// 获得全类名 System.out.println(userClass.getSimpleName());// 获得类名 // 获得属性 Field[] fields = userClass.getDeclaredFields();// 获得所有的属性 for (Field field : fields) { System.out.println(field.getName()); } System.out.println(userClass.getDeclaredField("id").getName());// 获得指定的属性 // 获得方法 Method[] methods = userClass.getDeclaredMethods();// 获得所有的方法 for (Method method : methods) { System.out.println(method.getName()); } Method method = userClass.getDeclaredMethod("setId", int.class);// 获得指定的方法,前面方法名,后面方法的参数 System.out.println(method.getName()); // 获得构造器 Constructor[] constructors = userClass.getDeclaredConstructors(); System.out.println(constructors.length); Constructor constructor = userClass.getDeclaredConstructor(int.class, String.class, int.class);// 获得指定的构造器,需要指定构造的参数 System.out.println(constructor.getName()); // 获得注解 Annotation[] annotations = userClass.getAnnotations(); for (Annotation annotation : annotations) { System.out.println(annotation); } // 指定注解名 MyAnnotation annotation = (MyAnnotation)userClass.getDeclaredAnnotation(MyAnnotation.class); System.out.println(annotation); } }
package com.dingyu; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import org.junit.Test; /** * 使用反射动态的调用构造器,方法,修改属性 * @author 70241 * */ public class ClassDemo03 { @Test @SuppressWarnings("all") public void usingClass() throws Exception { Class class1 = Class.forName("com.dingyu.User"); //使用反射去调用构造器 User user1 = (User) class1.newInstance();//调用的是无参的 Constructor constructor = class1.getDeclaredConstructor(int.class,String.class,int.class);//获得有参的构造器 User user2 = (User) constructor.newInstance(04,"dingyu",20);//动态生成对象 //使用反射去调用方法 Method methodSetId = class1.getDeclaredMethod("setId",int.class); methodSetId.invoke(user1, 02);//执行user1中的setId,后面是给的参数 System.out.println(user1.getId()); //使用反射去修改属性的值 Field field = class1.getDeclaredField("age"); field.setAccessible(true);//因为age是私有的,加上这句就表示这个属性不需要做安全检查 field.set(user1, 20); System.out.println(field.get(user1)); System.out.println(user1.getAge()); } }
package com.dingyu; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Map; /** * 反射获得带泛型的参数或返回值里泛型的的类型 * @author dingyu * */ public class ClassDemo04 { public void test01(Map<Integer, String> map, String s) { } public Map<Integer, String> test02() { return null; } public static void main(String[] args) throws Exception { //参数中带泛型的 Method method = ClassDemo04.class.getDeclaredMethod("test01", Map.class, String.class); Type[] types = method.getGenericParameterTypes();// 返回一个 Type对象的数组, Type以声明顺序表示由该对象表示的可执行文件的形式参数类型 // 打印这些参数的类型 for (Type type : types) { System.out.println(type.getTypeName()); if (type instanceof ParameterizedType) {// 如果是泛型的参数 Type[] actualTypeArguments = ((ParameterizedType) type).getActualTypeArguments();// 获得泛型的的类型 for (Type type2 : actualTypeArguments) { System.out.println(type2.getTypeName()); } } } //返回值中带泛型的 Method method02 = ClassDemo04.class.getDeclaredMethod("test02"); Type type = method02.getGenericReturnType();// 返回的类型 // 打印这些返回的类型 System.out.println(type.getTypeName()); if (type instanceof ParameterizedType) {// 如果是泛型的参数 Type[] actualTypeArguments = ((ParameterizedType) type).getActualTypeArguments();// 获得泛型的的类型 for (Type type2 : actualTypeArguments) { System.out.println(type2.getTypeName()); } } } }
위 내용은 Java 리플렉션에 대한 간략한 소개(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!