반사 메커니즘은 실행 중인 상태에서 모든 클래스에 대해 이 클래스의 모든 속성과 메서드를 알 수 있고 이 동적 획득을 호출할 수 있다는 것입니다. 정보와 객체의 메소드를 동적으로 호출하는 기능을 Java 언어의 반사 메커니즘이라고 합니다. [공문서 번역]
이 글에서는 다음과 같은 측면에서 성찰 지식을 소개합니다.
객체지향의 세계에서는 모든 것이 객체입니다. 클래스는 객체이고 클래스는 java.lang.Class 클래스의 인스턴스 객체입니다. 또한 클래스 클래스는 Java 가상 머신에서만 새로 생성될 수 있습니다. 모든 클래스는 Class 클래스의 인스턴스 객체입니다. 이 인스턴스 객체에는 세 가지 표현식이 있습니다.
public class User{ } public class ClassTest{ User u=new User(); //方式1: Class c1=User.class; //方式2: Class c2=u.getClass(); //方式3: Class c3=Class.forName("com.forezp.User"); //可以通过类的类型创建该类的实例对象 User user=(User)c1.newInstance(); }
Class.forName(클래스의 전체 이름) 이 메소드는 클래스의 유형을 나타낼 뿐만 아니라 또한 동적 Load 클래스를 나타냅니다. 컴파일 타임에 로드된 클래스는 정적 로드되고, 런타임에 로드된 클래스는 동적으로 로드됩니다.
기본 데이터 유형, void 키워드는 Class 클래스의 인스턴스입니다. getame()을 통해 클래스 이름을 얻을 수 있습니다. ) .
Class c1=String.class; Class c2=int.class; Class c3=void.class; System.out.println(c1.getName()); System.out.println(c2.getSimpleName());
클래스의 모든 메소드를 가져오고 인쇄합니다:
public static void printClassInfo(Object object){ Class c=object.getClass(); System.out.println("类的名称:"+c.getName()); /** * 一个成员方法就是一个method对象 * getMethod()所有的 public方法,包括父类继承的 public * getDeclaredMethods()获取该类所有的方法,包括private ,但不包括继承的方法。 */ Method[] methods=c.getMethods();//获取方法 //获取所以的方法,包括private ,c.getDeclaredMethods(); for(int i=0;i<methods.length;i++){ //得到方法的返回类型 Class returnType=methods[i].getReturnType(); System.out.print(returnType.getName()); //得到方法名: System.out.print(methods[i].getName()+"("); Class[] parameterTypes=methods[i].getParameterTypes(); for(Class class1:parameterTypes){ System.out.print(class1.getName()+","); } System.out.println(")"); } }
public class ReflectTest { public static void main(String[] args){ String s="ss"; ClassUtil.printClassInfo(s); } }
실행:
类的名称:java.lang.String booleanequals(java.lang.Object,) java.lang.StringtoString() inthashCode() …
public static void printFiledInfo(Object o){ Class c=o.getClass(); /** * getFileds()获取public * getDeclaredFields()获取所有 */ Field[] fileds=c.getDeclaredFields(); for(Field f:fileds){ //获取成员变量的类型 Class filedType=f.getType(); System.out.println(filedType.getName()+" "+f.getName()); } }
public static void main(String[] args){ String s="ss"; //ClassUtil.printClassInfo(s); ClassUtil.printFiledInfo(s); }실행:
[C value int hash long serialVersionUID [Ljava.io.ObjectStreamField; serialPersistentFields java.util.Comparator CASE_INSENSITIVE_ORDER int HASHING_SEED int hash325. 생성자 정보 가져오기
public static void printConstructInfo(Object o){ Class c=o.getClass(); Constructor[] constructors=c.getDeclaredConstructors(); for (Constructor con:constructors){ System.out.print(con.getName()+”(“); Class[] typeParas=con.getParameterTypes(); for (Class class1:typeParas){ System.out.print(class1.getName()+” ,”); } System.out.println(“)”); } }
public static void main(String[] args){ String s="ss"; //ClassUtil.printClassInfo(s); //ClassUtil.printFiledInfo(s); ClassUtil.printConstructInfo(s); }
java.lang.String([B ,) java.lang.String([B ,int ,int ,) java.lang.String([B ,java.nio.char set .Charset ,) java.lang.String([B ,java.lang.String ,) java.lang.String([B ,int ,int ,java.nio.charset.Charset ,) java.lang.String(int ,int ,[C ,) java.lang.String([C ,boolean ,) java.lang.String(java.lang.StringBuilder ,) java.lang.String(java.lang.StringBuffer ,)6. 메소드 반영 작업메서드 가져오기: 메소드 이름과 매개변수를 가져와야 합니다. 방법. 메소드의 반사 연산:
method.invoke(对象,参数列表);예:
class A{ public void add(int a,int b){ System.out.print(a+b); } public void toUpper(String a){ System.out.print(a.toUpperCase()); } }
public static void main(String[] args) { A a=new A(); Class c=a.getClass(); try { Method method=c.getMethod("add",new Class[]{int.class,int.class}); //也可以 Method method=c.getMethod("add",int.class,int.class); //方法的反射操作 method.invoke(a,10,10); }catch (Exception e){ e.printStackTrace(); } }실행:
20
위 내용은 Java 반사 메커니즘 지식 요약에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!