>  기사  >  Java  >  Java 반사 메커니즘의 예제 코드에 대한 자세한 설명

Java 반사 메커니즘의 예제 코드에 대한 자세한 설명

黄舟
黄舟원래의
2017-03-27 10:53:351156검색

이 글은 주로 Java 반사 메커니즘에 대한 자세한 설명과 예시를 소개합니다. 필요한 친구는

Java 반사 메커니즘에 대한 자세한 설명과 예시

를 참고하세요. 반성, 디자인 패턴에서 어떤 정보를 읽었고, 활용했을 수도 있다는 말을 자주 들었는데, 깊이 이해하지 못했다는 느낌이 들어서 이번에 다시 공부하게 되었습니다. 괜찮다고 느꼈어요 바!

먼저 반사의 개념을 살펴보겠습니다.

주로 자체 상태에 액세스하고 이를 감지하고 수정하는 프로그램의 기능을 나타냅니다. 또는 동작. 자체 동작의 상태 및 결과를 기반으로 애플리케이션에서 설명하는 동작의 상태 및 관련 의미를 조정하거나 수정할 수 있습니다.

Reflection은 구성 요소 간 소스 코드 링크 없이 런타임에 조합할 수 있는 유연한 코드를 쉽게 생성할 수 있는 강력한 Java 도구입니다. 그러나 리플렉션을 부적절하게 사용하면 비용이 많이 들 수 있습니다!

개념이 헷갈린다면 계속 읽어보세요.

2. 반사 메커니즘의 역할:

1. 디컴파일: .class-->.Java

2. 리플렉션 메커니즘을 통해 java객체속성, 메서드, 생성자 메서드 등에 액세스합니다. 🎜>

이 기능을 어떻게 구현하는지 자세히 알아보면 더 이해하기 쉬울 것 같습니다.

셋째, 리플렉션 메커니즘에서 sun이 제공하는 클래스를 살펴보겠습니다.

java.lang.Class;    
java.lang.reflect.Constructor; java.lang.reflect.Field;  
java.lang.reflect.Method;
java.lang.reflect.Modifier;

우리는 다양한 메소드, 속성 및 기타 작업을 사용할 수 있습니다.

쿼리를 이 네 가지 카테고리에 반영했습니다. 아니면 API를 끊임없이 쿼리하는 법을 배워야 하는지, 그것이 최고의 스승입니다.

4. 특정 함수 구현:

1. 리플렉션 메커니즘을 통해 클래스를 가져오는 방법에는 세 가지가 있습니다. Employee 유형을 가져오겠습니다

//第一种方式: 
Classc1 = Class.forName("Employee"); 
//第二种方式: 
//java中每个类型都有class 属性. 
Classc2 = Employee.class; 
 
//第三种方式: 
//java语言中任何一个java对象都有getClass 方法 
Employeee = new Employee(); 
Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)

2 ,

객체 생성 : 클래스를 가져온 후 newInstance를 사용하여 객체를 생성합니다.

Class c =Class.forName("Employee"); 
 
//创建此Class 对象所表示的类的一个新实例 
Objecto = c.newInstance(); //调用了Employee的无参数构造方法.

3. 속성 가져오기: 모든 속성으로 나누어 지정된 속성:


a, 먼저 모든 속성을 가져오는 방법을 살펴보세요.

//获取整个类 
   Class c = Class.forName("java.lang.Integer"); 
    //获取所有的属性? 
   Field[] fs = c.getDeclaredFields(); 
  
     //定义可变长的字符串,用来存储属性 
   StringBuffer sb = new StringBuffer(); 
   //通过追加的方法,将每个属性拼接到此字符串中 
   //最外边的public定义 
   sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n"); 
   //里边的每一个属性 
   for(Field field:fs){ 
    sb.append("\t");//空格 
    sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等 
    sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字 
    sb.append(field.getName()+";\n");//属性的名字+回车 
   } 
  
   sb.append("}"); 
  
   System.out.println(sb);

b, 특정 속성을 가져오고, 기존 방법과 비교하여 학습합니다.

public static void main(String[] args) throws Exception{ 
    
<span style="white-space:pre"> </span>//以前的方式: 
 /* 
 User u = new User(); 
 u.age = 12; //set 
 System.out.println(u.age); //get 
 */ 
    
 //获取类 
 Class c = Class.forName("User"); 
 //获取id属性 
 Field idF = c.getDeclaredField("id"); 
 //实例化这个类赋给o 
 Object o = c.newInstance(); 
 //打破封装 
 idF.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。 
 //给o对象的id属性赋值"110" 
 idF.set(o, "110"); //set 
 //get 
 System.out.println(idF.get(o)); 
}

4, 메서드 가져오기, 그리고 시공방법은 자세히 설명하지 않으니 키워드만 보시면 됩니다:


메소드 키워드

의미

getDeclaredMethods()

모든 메소드 가져오기

getReturnType()

메서드의 반환 유형 가져오기

getParameterTypes ()

메서드의 수신 매개변수 유형 가져오기

getDeclaredMethod("메서드 이름", 매개변수 유형 .class ,...)

특정 메서드 가져오기

생성자 키워드

의미

getDeclaredConstructors()

모든 생성자 가져오기

getDeclaredConstructor(매개변수 유형.class,… )

특정 생성자 가져오기

상위 클래스 및 상위 인터페이스

의미

getSuperclass ()

특정 클래스의 상위 클래스 가져오기

getInterfaces()

특정 유형으로 구현된 인터페이스 가져오기

         这样我们就可以获得类的各种内容,进行了反编译。对于JAVA这种先编译再运行的语言来说,反射机制可以使代码更加灵活,更加容易实现面向对象。 

  五,反射加配置文件,使我们的程序更加灵活:

             在设计模式学习当中,学习抽象工厂的时候就用到了反射来更加方便的读取数据库链接字符串等,当时不是太理解,就照着抄了。看一下.NET中的反射+配置文件的使用:

             当时用的配置文件是app.config文件,内容是XML格式的,里边填写链接数据库的内容:

 <configuration> 
lt;appSettings> 
<add  key="" value=""/> 
lt;/appSettings> 
  </configuration>

 反射的写法:   

assembly.load("当前程序集的名称").CreateInstance("当前命名空间名称".要实例化的类名);

           这样的好处是很容易的方便我们变换数据库,例如我们将系统的数据库从SQL Server升级到Oracle,那么我们写两份D层,在配置文件的内容改一下,或者加条件选择一下即可,带来了很大的方便。            

         当然了,JAVA中其实也是一样,只不过这里的配置文件为.properties,称作属性文件。通过反射读取里边的内容。这样代码是固定的,但是配置文件的内容我们可以改,这样使我们的代码灵活了很多!

    综上为,JAVA反射的再次学习,灵活的运用它,能够使我们的代码更加灵活,但是它也有它的缺点,就是运用它会使我们的软件的性能降低,复杂度增加,所以还要我们慎重的使用它。

위 내용은 Java 반사 메커니즘의 예제 코드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.