1. JAVA의 반사 메커니즘은 무엇인가요? (권장: java 비디오 튜토리얼)
Java 반사는 Java입니다. 동적(또는 준동적) 언어의 핵심 속성으로 간주됩니다. 이 메커니즘을 사용하면 프로그램은 수정자(예: public, static 등), 슈퍼클래스(예: Object), 구현된 인터페이스(예: 복제 가능) 및 필드 및 메소드에 대한 모든 정보를 제공하며 런타임 시 필드 내용을 변경하거나 메소드를 호출할 수 있습니다.
Java 리플렉션 메커니즘을 사용하면 프로그램이 런타임에 컴파일하는 동안 완전히 알려지지 않은 클래스를 로드, 감지 및 사용할 수 있습니다.
즉, Java는 런타임에만 이름이 알려진 클래스를 로드하고 전체 구조를 얻을 수 있습니다.
2. JDK에서 제공하는 Reflection API
Java Reflection과 관련된 API는 java.lang.reflect 패키지에 들어있습니다. JDK 1.6.0의 Reflect 패키지는 아래와 같습니다. 아래: #🎜 🎜#
이 인터페이스는 관련 항목을 가져올 수 있습니다. 후자 생성자에 대한 클래스 멤버(도메인 또는 메서드) 정보입니다. | |
이 클래스는 도메인 개체, 메서드 개체 및 생성자 개체의 기본 클래스입니다. 이는 사용될 때 기본 Java 언어 액세스 제어 검사를 억제하는 것으로 반영된 객체를 표시하는 기능을 제공합니다. | |
이 클래스는 JAVA 배열을 동적으로 생성하고 액세스하는 메서드를 제공합니다. | |
클래스 생성자에 대한 정보와 클래스 생성자에 액세스하기 위한 인터페이스를 제공합니다. | |
클래스 필드에 대한 정보와 클래스 필드에 액세스할 수 있는 인터페이스를 제공합니다. | |
클래스의 메서드에 대한 정보와 클래스의 메서드에 액세스하기 위한 인터페이스를 제공합니다. | |
클래스 및 멤버 액세스 수정자를 디코딩하기 위한 정적 메서드와 상수를 제공합니다. | |
프록시 클래스와 클래스 인스턴스를 동적으로 생성하는 정적 메서드를 제공합니다. |
public Field getField(문자열 이름) | 이 클래스 객체가 나타내는 클래스 또는 인터페이스의 지정된 공용 멤버 필드를 반영하는 Field 객체를 반환합니다. |
public Field[] getFields() | 이 Class 객체 |
public Field getDeclaredField(문자열 이름) | 이 Class 객체를 반영하는 Field 객체를 반환합니다. 표현된 클래스 또는 인터페이스 |
public Field[] getDeclaredFields() | 이 Class 객체 |
Class<?> classType = ExtendType.class; // 使用getFields获取属性 Field[] fields = classType.getFields(); for (Field f : fields) { System.out.println(f); } System.out.println(); // 使用getDeclaredFields获取属性 fields = classType.getDeclaredFields(); for (Field f : fields) { System.out.println(f); }
输出:
public int com.quincy.ExtendType.pubIntExtendField
public java.lang.String com.quincy.ExtendType.pubStringExtendField
public int com.quincy.Type.pubIntField
public java.lang.String com.quincy.Type.pubStringField
public int com.quincy.ExtendType.pubIntExtendField
public java.lang.String com.quincy.ExtendType.pubStringExtendField
private int com.quincy.ExtendType.prvIntExtendField
可见getFields和getDeclaredFields区别:
getFields返回的是申明为public的属性,包括父类中定义,
getDeclaredFields返回的是指定类定义的所有定义的属性,不包括父类的。
3、获取类的Method
通过反射机制得到某个类的某个方法,然后调用对应于这个类的某个实例的该方法
Class
public Method getMethod(String name, Class<?>... parameterTypes)
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法
public Method[] getMethods()
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法
public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法
public Method[] getDeclaredMethods()
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法
// 使用getMethods获取函数 Class<?> classType = ExtendType.class; Method[] methods = classType.getMethods(); for (Method m : methods) { System.out.println(m); } System.out.println(); // 使用getDeclaredMethods获取函数 methods = classType.getDeclaredMethods(); for (Method m : methods) { System.out.println(m); }
输出:
public void com.quincy.ExtendType.setIntExtendField(int)
public int com.quincy.ExtendType.getIntExtendField()
public void com.quincy.Type.setIntField(int)
public int com.quincy.Type.getIntField()
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
private void com.quincy.ExtendType.Log(java.lang.String)
public void com.quincy.ExtendType.setIntExtendField(int)
public int com.quincy.ExtendType.getIntExtendField()
4、获取类的Constructor
通过反射机制得到某个类的构造器,然后调用该构造器创建该类的一个实例
Class
public Constructor<T> getConstructor(Class<?>... parameterTypes)
返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法
public Constructor<?>[] getConstructors()
返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法
public Constructor<?>[] getDeclaredConstructors()
返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。它们是公共、保护、默认(包)访问和私有构造方法
// 使用getConstructors获取构造器 Constructor<?>[] constructors = classType.getConstructors(); for (Constructor<?> m : constructors) { System.out.println(m); } System.out.println(); // 使用getDeclaredConstructors获取构造器 constructors = classType.getDeclaredConstructors(); for (Constructor<?> m : constructors) { System.out.println(m); } 输出: public com.quincy.ExtendType() public com.quincy.ExtendType() com.quincy.ExtendType(int,java.lang.String)
5、新建类的实例
通过反射机制创建新类的实例,有几种方法可以创建
调用无自变量ctor:
1、调用类的Class对象的newInstance方法,该方法会调用对象的默认构造器,如果没有默认构造器,会调用失败.
Class<?> classType = ExtendType.class; Object inst = classType.newInstance(); System.out.println(inst);
输出:
Type:Default Constructor
ExtendType:Default Constructor
com.quincy.ExtendType@d80be3
2、调用默认Constructor对象的newInstance方法
Class<?> classType = ExtendType.class; Constructor<?> constructor1 = classType.getConstructor(); Object inst = constructor1.newInstance(); System.out.println(inst);
输出:
Type:Default Constructor
ExtendType:Default Constructor
com.quincy.ExtendType@1006d75
调用带参数ctor:
3、调用带参数Constructor对象的newInstance方法
Constructor<?> constructor2 = classType.getDeclaredConstructor(int.class, String.class); Object inst = constructor2.newInstance(1, "123"); System.out.println(inst);
输出:
Type:Default Constructor
ExtendType:Constructor with parameters
com.quincy.ExtendType@15e83f9
6、调用类的函数
通过反射获取类Method对象,调用Field的Invoke方法调用函数。
Class<?> classType = ExtendType.class; Object inst = classType.newInstance(); Method logMethod = classType.<strong>getDeclaredMethod</strong>("Log", String.class); logMethod.invoke(inst, "test"); 输出: Type:Default Constructor ExtendType:Default Constructor <font color="#ff0000">Class com.quincy.ClassT can not access a member of class com.quincy.ExtendType with modifiers "private"</font> <font color="#ff0000">上面失败是由于没有权限调用private函数,这里需要设置Accessible为true;</font> Class<?> classType = ExtendType.class; Object inst = classType.newInstance(); Method logMethod = classType.getDeclaredMethod("Log", String.class); <font color="#ff0000">logMethod.setAccessible(true);</font> logMethod.invoke(inst, "test");
7、设置/获取类的属性值
通过反射获取类的Field对象,调用Field方法设置或获取值
Class<?> classType = ExtendType.class; Object inst = classType.newInstance(); Field intField = classType.getField("pubIntExtendField"); intField.<strong>setInt</strong>(inst, 100); int value = intField.<strong>getInt</strong>(inst);
四、动态创建代理类
代理模式:代理模式的作用=为其他对象提供一种代理以控制对这个对象的访问。
代理模式的角色:
抽象角色:声明真实对象和代理对象的共同接口
代理角色:代理角色内部包含有真实对象的引用,从而可以操作真实对象。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
动态代理:
java.lang.reflect.Proxy:
Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类
InvocationHandler:
是代理实例的调用处理程序 实现的接口,每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。
动态Proxy是这样的一种类:
它是在运行生成的类,在生成时你必须提供一组Interface给它,然后该class就宣称它实现了这些interface。你可以把该class的实例当作这些interface中的任何一个来用。当然,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。
在使用动态代理类时,我们必须实现InvocationHandler接口
步骤:
1、定义抽象角色
public interface Subject { public void Request(); }
2、定义真实角色
public class RealSubject implements Subject { @Override public void Request() { // TODO Auto-generated method stub System.out.println("RealSubject"); } }
3、定义代理角色
public class DynamicSubject implements InvocationHandler { private Object sub; public DynamicSubject(Object obj){ this.sub = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub System.out.println("Method:"+ method + ",Args:" + args); method.invoke(sub, args); return null; } }
4、通过Proxy.newProxyInstance构建代理对象
RealSubject realSub = new RealSubject(); InvocationHandler handler = new DynamicSubject(realSub); Class<?> classType = handler.getClass(); Subject sub = (Subject)Proxy.newProxyInstance(classType.getClassLoader(), realSub.getClass().getInterfaces(), handler); System.out.println(sub.getClass());
5、通过调用代理对象的方法去调用真实角色的方法。
sub.Request();
输出:
class $Proxy0 新建的代理对象,它实现指定的接口
Method:public abstract void DynamicProxy.Subject.Request(),Args:null
RealSubject 调用的真实对象的方法
更多java知识请关注java基础教程栏目。
위 내용은 Java 반사 메커니즘에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

封装是一种信息隐藏技术,是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法;封装可以被认为是一个保护屏障,防止指定类的代码和数据被外部类定义的代码随机访问。封装可以通过关键字private,protected和public实现。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于设计模式的相关问题,主要将装饰器模式的相关内容,指在不改变现有对象结构的情况下,动态地给该对象增加一些职责的模式,希望对大家有帮助。


핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

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

SecList
SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.
