反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。【翻译于 官方文档】
이 기사에서는 다음과 같은 측면에서 Reflection에 대한 지식을 소개합니다.
클래스 사용
메서드 반영
생성자 반영
멤버 변수 반영
1. 클래스란 무엇인가요
객체 지향 세계에서는 모든 것이 객체입니다. 클래스는 객체이고 클래스는 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();
}
2. 클래스의 동적 로딩
Class.forName(클래스의 전체 이름) 이 메소드는 클래스의 유형을 나타낼 뿐만 아니라 클래스의 동적 로딩도 나타냅니다. 수업. 컴파일 타임에 로드된 클래스는 정적으로 로드되고, 런타임에 로드된 클래스는 동적으로 로드됩니다.
3. 메소드 정보 얻기
기본 데이터 유형과 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() …
4. 멤버 변수 정보 가져오기
클래스의 멤버 변수 정보도 가져올 수 있습니다.
public static void printFiledInfo(Object o){
클래스 c=o.getClass(); /**
* getFileds()는 공개됩니다.
* getDeclaredFields()는 모두를 가져옵니다.*/
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

PhpStorm 맥 버전
최신(2018.2.1) 전문 PHP 통합 개발 도구
