Java에서는 리플렉션을 통해 클래스 정보를 얻습니다.
무료 학습 권장사항: java 기본 튜토리얼
목차
- 1. 필드 가져오기
- 2. 리플렉션을 통해 개체 속성에 액세스합니다. 메커니즘
- 4. 가변 길이 매개변수
- 5. 반사 방법(이해)
- 6. 반사 메커니즘 호출 방법
- 9. 반사 메커니즘은 생성자를 호출합니다. 상위 클래스 및 상위 인터페이스
- 이전 섹션에서는 리플렉션 메커니즘에 대해 자세히 소개했습니다. 이번 섹션에서는 리플렉션을 통해 클래스 속성, 메서드 및 기타 정보를 얻는 방법을 소개하겠습니다.
- 1. 필드 가져오기
public class ReflectTest03 { public static void main(String[] args) throws Exception{ //1.获取整个类 Class studentClass=Class.forName("cn.yujie.bean.Student"); String className=studentClass.getName(); System.out.println(className); System.out.println(studentClass.getSimpleName()); //获取类中的所有public的Field Field[] fields=studentClass.getFields(); System.out.println(fields.length); //测试数组中只有1个元素 //测试这个field Field f=fields[0]; //取出field的它的名字 String fieldName=f.getName(); System.out.println(fieldName); //获取所有的Field //获取所有的Field Field[] fs=studentClass.getDeclaredFields(); System.out.println(fs.length); System.out.println("-----------------"); //遍历 for(Field field :fs){ //获取属性的修饰符列表 //返回的修饰符是一个数字,每个数字是修饰符的代号 int i=field.getModifiers(); //可以将这个代号数字转换成字符串 String ModifierString = Modifier.toString(i); System.out.print(ModifierString+" "); //获取属性的类型 Class fieldType=field.getType(); String fName=fieldType.getSimpleName(); System.out.print(fName+" "); //获取属性的名字 System.out.println(field.getName()+" "); System.out.println(); } }}
로그인 후 복사
반사 메커니즘 Fieldpublic class ReflectTest05 {
public static void main(String[] args) throws Exception{
//创建这个是为了拼接字符串
StringBuilder s=new StringBuilder();
Class studentClass=Class.forName("cn.yujie.bean.Student");
s.append(Modifier.toString(studentClass.getModifiers())+" class "+studentClass.getSimpleName()+"{");
Field[] fields=studentClass.getDeclaredFields();
s.append(";\n");
for(Field field:fields){
s.append("\t");
s.append(Modifier.toString(field.getModifiers()));
s.append(" ");
s.append(field.getType().getSimpleName());
s.append(" ");
s.append(field.getName());
s.append(";\n");
}
s.append("}");
System.out.println(s);
}}
3을 통해 객체 속성에 액세스합니다. 필수 마스터:
반사 메커니즘을 통해 개체의 속성에 액세스하는 방법
속성 집합에 값 할당
속성 get의 값 가져오기
public class ReflectTest07 { public static void main(String[] args) throws Exception{ Class studentClass=Class.forName("cn.yujie.bean.Student"); //使用反射机制,怎么取访问一个对象的属性 Object obj=studentClass.newInstance(); //obj就是student对象(底层调用无参数构造方法) //获取no属性(根据属性的名称获取Field) Field noFiled=studentClass.getDeclaredField("no"); //给obj对象(Student对象)的no属性赋值 //s.no=111; //给s对象的no属性赋值111,三要素,对象,属性和值 //虽然使用了反射机制,但是三要素还是缺一不可 //注意,反射机制让代码复杂了,但是为了一个灵活,这也是值得的。 noFiled.set(obj,222); //给obj对象的no属性赋值222 //读取属性的值 //两个要素:获取obj对象no属性的值 System.out.println(noFiled.get(obj)); //可以访问私有属性吗 Field nameField=studentClass.getDeclaredField("name"); //打破封装(反射机制的缺点:打破封装,可能会给不法分子留下机会) nameField.setAccessible(true); //给name属性赋值 nameField.set(obj,"jackson"); //获取name属性的值 System.out.println(nameField.get(obj)); }}
4 가변 길이 매개변수 int… args는 가변 길이 매개변수입니다.
구문은 다음과 같습니다. 유형...(참고: 점 3개여야 함)
1 가변 길이 매개변수에 필요한 매개변수 수는 0-n
3. 가변 길이는 배열로 간주될 수 있습니다
public class ArgumentsTest { public static void main(String[] args) { m(); m(10); m(20,40); //m("abc");编译错误 m3("ab","cd","def","de9"); String [] strs={"a","b","c"}; m3(strs); } public static void m(int... args){ } //必须在最后一个,且只有1个// public static void m2(String... args1,int...args2){//// } public static void m3(String ...args){ //可以将可变长度参数当成一个数组来看 for(int i=0;i<args.length><p><br>5. <strong></strong></p> <pre class="brush:php;toolbar:false">public class ReflectTest08 { public static void main(String[] args) throws Exception{ //获取类了 Class userServiceClass = Class.forName("cn.yujie.service.UserService"); //获取所有的Method(包括私有的) Method[] methods=userServiceClass.getDeclaredMethods(); System.out.println(methods.length); //2 //遍历Method for(Method method:methods){ //获取修饰符列表 System.out.println(Modifier.toString(method.getModifiers())); //获取方法的返回值类型 System.out.println(method.getReturnType().getSimpleName()); //获取方法名 System.out.println(method.getName()); //方法的参数列表(一个方法的参数可能有多个) Class[] parameterTypes=method.getParameterTypes(); for(Class parameterType:parameterTypes){ System.out.println(parameterType.getSimpleName()); } } }}
6. 디컴파일(이해)
public class ReflectTest09 { public static void main(String[] args) throws Exception{ StringBuilder s=new StringBuilder(); Class userServiceClass = Class.forName("cn.yujie.service.UserService"); s.append("public class UserService{ "); s.append(Modifier.toString(userServiceClass.getModifiers())+"class "+userServiceClass.getSimpleName()+"{ "+"\n"); Method[] methods=userServiceClass.getDeclaredMethods(); for(Method method:methods){ s.append("\t"); s.append(Modifier.toString(method.getModifiers())); s.append(" "); s.append(method.getReturnType().getSimpleName()); s.append(" "); s.append(method.getName()); s.append("("); //参数列表 Class[] parameterTypes = method.getParameterTypes(); for(Class parameterType:parameterTypes){ s.append(parameterType.getSimpleName()); s.append(","); } s.append("){}\n"); } //删除指定下标位置上的字符 s.deleteCharAt(s.length()-1); s.append("}"); System.out.println(s); }}
로그인 후 복사- 7. 리플렉션 메커니즘 호출 메서드
- 핵심: 리플렉션 메커니즘을 통해 메서드를 호출하는 방법을 마스터해야 합니다.
. public class ReflectTest10 {
public static void main(String[] args) throws Exception{
//通过反射机制调用方法
Class userServiceClass = Class.forName("cn.yujie.service.UserService");
//创建对象
Object obj=userServiceClass.newInstance();
//java中有重载,java中通过方法名和形参来区分方法
Method loginMethod=userServiceClass.getDeclaredMethod("login",String.class,String.class);
//调用方法
//调用方法有几个要素
//要素1:对象,要素2:方法名,要素3:参数列表,要素4:返回值
//反射机制中最重要的一个方法:必须记住
//四要素
/*
loginMethod方法,obj对象
admin,123是参数列表,retValue是返回值
* */
Object retValue=loginMethod.invoke(obj,"admin","123");
}}
public class ReflectTest11 {
public static void main(String[] args) throws Exception{
StringBuilder s=new StringBuilder();
Class vipClass=Class.forName("cn.yujie.bean.Vip");
s.append(Modifier.toString(vipClass.getModifiers()));
s.append(" class ");
s.append(vipClass.getSimpleName());
s.append("{\n");
//拼接构造方法
Constructor[] constructors=vipClass.getDeclaredConstructors();
for(Constructor constructor:constructors){
s.append("\t");
s.append(Modifier.toString(constructor.getModifiers()));
s.append(" ");
s.append(vipClass.getSimpleName());
s.append("(");
Class[] parameterTypes=constructor.getParameterTypes();
for(Class parameterType:parameterTypes){
s.append(parameterType.getSimpleName());
s.append(",");
}
if(parameterTypes.length>0) {
s.deleteCharAt(s.length() - 1);
}
s.append("){}\n");
}
s.append("}");
System.out.println(s);
}}
public class ReflectTest12 {
public static void main(String[] args) throws Exception{
//使用反射机制怎么创建对象
Class vipClass=Class.forName("cn.yujie.bean.Vip");
//调用无参构造方法
Object obj= vipClass.newInstance();
//调用有参数构造方法
//第一步:先获取到有参数构造方法
Constructor con=vipClass.getDeclaredConstructor(int.class,String.class,String.class,boolean.class);
//第二步:调用构造方法new对象
Object newObj=con.newInstance(110,"jackson","1999-10-11",true);
System.out.println(newObj);
}}
10. 관련 무료 학습 권장 사항:
자바 기본
위 내용은 Java에서는 리플렉션을 통해 클래스 정보를 얻습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

캡슐은 3 차원 기하학적 그림이며, 양쪽 끝에 실린더와 반구로 구성됩니다. 캡슐의 부피는 실린더의 부피와 양쪽 끝에 반구의 부피를 첨가하여 계산할 수 있습니다. 이 튜토리얼은 다른 방법을 사용하여 Java에서 주어진 캡슐의 부피를 계산하는 방법에 대해 논의합니다. 캡슐 볼륨 공식 캡슐 볼륨에 대한 공식은 다음과 같습니다. 캡슐 부피 = 원통형 볼륨 2 반구 볼륨 안에, R : 반구의 반경. H : 실린더의 높이 (반구 제외). 예 1 입력하다 반경 = 5 단위 높이 = 10 단위 산출 볼륨 = 1570.8 입방 단위 설명하다 공식을 사용하여 볼륨 계산 : 부피 = π × r2 × h (4

Spring Boot는 강력하고 확장 가능하며 생산 가능한 Java 응용 프로그램의 생성을 단순화하여 Java 개발에 혁명을 일으킨다. Spring Ecosystem에 내재 된 "구성에 대한 협약"접근 방식은 수동 설정, Allo를 최소화합니다.
