反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。【翻译于 官方文档】
이 기사에서는 다음과 같은 측면에서 Reflection에 대한 지식을 소개합니다.
클래스 사용
메서드 반영
생성자 반영
멤버 변수 반영
객체 지향 세계에서는 모든 것이 객체입니다. 클래스는 객체이고 클래스는 java.lang.Class 클래스의 인스턴스 객체입니다. 또한 클래스 클래스는 Java 가상 머신에서만 새로 생성될 수 있습니다. 모든 클래스는 Class 클래스의 인스턴스 객체입니다. 이 인스턴스 객체에는 세 가지 표현 메서드가 있습니다.
public class User{
}
public class ClassTest{
User u=new User();
//방법 1 :
클래스 c1=User.class;
//방법 2:
클래스 c2=u.getClass();
//방법 3:
클래스 c3=Class.forName(" com.forezp.User");
//클래스 유형을 통해 클래스의 인스턴스 객체를 생성할 수 있습니다
User user=(User)c1.newInstance();
}
Class.forName(클래스의 전체 이름) 이 메소드는 클래스의 유형을 나타낼 뿐만 아니라 클래스의 동적 로딩도 나타냅니다. 수업. 컴파일 타임에 로드된 클래스는 정적으로 로드되고, 런타임에 로드된 클래스는 동적으로 로드됩니다.
기본 데이터 유형과 void 키워드는 Class 클래스의 인스턴스입니다. getame()을 통해 클래스 이름을 얻을 수 있습니다. () .
클래스 c1=String.class;
클래스 c2=int.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());
/**
* 멤버 메소드는 메소드 객체입니다.
* * getMethod()는 상위 클래스에서 상속된 메소드를 포함하여 모든 공개 메소드를 가져옵니다.
* getDeclaredMethods()는 비공개 메소드를 포함하여 클래스의 모든 메소드를 가져옵니다. 하지만 상속된 메서드는 아닙니다.
*/
메소드[] 메소드= c.getMethods();//메서드 가져오기
//private, c.getDeclaredMethods();
를 포함한 모든 메서드 가져오기 for(int i=0;i
Class[] parameterTypes=methods[i].getParameterTypes();
for(Class class1:parameterTypes){
System.out.print(class1.getName()+ ","); }
공용 클래스 ReflectTest {
public static void main(String[] args){
String s="ss";
ClassUtil.printClassInfo(s);
}
}
실행:
类的名称:java.lang.String booleanequals(java.lang.Object,) java.lang.StringtoString() inthashCode() …
*/
Field[] fileds=c .getDeclaredFields();
for(Field f:fileds){
+f.getName());
}
}
public static void main(String [] args){
String s="ss"; 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 hash32
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.charset.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 ,) ...
获取一个方法:需要获取方法的名称和方法的参数才能决定一个方法。
方法的反射操作:
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反射的基本用法, 它可以在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
위 내용은 마스터해야 할 Java 반사 메커니즘에 대한 지식 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!