>  기사  >  Java  >  Java의 반사 메커니즘(배열 매개변수 포함)에 대한 심층적인 이해

Java의 반사 메커니즘(배열 매개변수 포함)에 대한 심층적인 이해

青灯夜游
青灯夜游앞으로
2019-11-28 17:35:342254검색

Java의 반사 메커니즘(배열 매개변수 포함)에 대한 심층적인 이해

Java의 리플렉션은 제가 항상 매우 좋아했던 것입니다. 이를 통해 프로그램의 유연성이 크게 향상될 수 있고 다양성도 많이 향상되기 때문입니다. 나는 성찰의 원리를 거창하게 소개하고 싶지는 않습니다. 인터넷에서 검색해 보면 많은 것을 찾을 수 있습니다. (아래 부록에서만 소개하겠습니다)

리플렉션은 동적(또는 준동적) 언어로 간주되는 Java의 핵심 속성입니다. 이 메커니즘을 사용하면 프로그램은 수정자(예: public, static 등), 슈퍼클래스(예: Object), 구현된 인터페이스(예: Cloneable), 필드와 메소드에 대한 모든 정보를 포함하며 런타임에 필드의 내용을 변경하거나 메소드를 호출할 수 있습니다

[추천 학습: java 비디오 튜토리얼]

여기서 제가 말씀드리고 싶은 것은 문자열을 기준으로 우리가 원하는 것 데이터를 전송할 때 해야 할 일(해당 메소드의 동적인 실행, 해당 클래스의 생성 등)은 대부분 문자열(HTTP, 소켓) 등입니다. 이러한 문자열을 수신할 때 우리는 다음을 사용합니다. 이를 기반으로 문자열의 내용을 기반으로 해당 작업을 수행하는 것은 매우 좋은 일입니다. 원격으로 메서드를 호출할 수 있습니다(클라이언트는 지정된 문자열을 보내고 서버는 리플렉션을 기반으로 해당 메서드를 실행하게 합니다). . .

사실 저도 그런 프로젝트를 해본 적이 있습니다. 클라이언트(Java 언어로 작성되지 않음)는 소켓을 사용하여 서버(Java로 작성됨) 메소드를 호출하고 매개변수를 직접 전달할 수도 있습니다. 이는 모두 Java의 리플렉션을 기반으로 구현됩니다. 기술. 좋아, 나머지에 대해 이야기해보자. 가장 기본적인 것부터 시작해 보자. 다음은 기본적인 반영 방법이다.

/**
 * @(#)TestInt.java
 * 
 * @author soda E-mail:sujun10@21cn.com
 * @version 1.0
 * <br>Copyright (C), 2007 soda.C
 * <br>This program is protected by copyright laws.
 * <br>Date:2007.4
 */
import java.lang.reflect.Method;

public class TestInt 
{
  //测试方法
  public String test(String name,int i)
  {
    System.out.println("name:" + name);
    System.out.println(i);
    return "反射成功!";
  }

  public static void main(String[] args)
  {
    try
    {
      //获取class文件,可以Class.for("Test")获取,这样也可以根据字符串生成类啦
      Class te = TestInt.class;
      Class[] cl = new Class[2];
      //添加参数类型
      cl[0] = String.class;
      cl[1] = int.class;
      System.out.println("11111111");
      //根据public的方法,以及参数,参数是Class[]形式
      Method method = te.getMethod("test", cl);
      System.out.println("222222222222");
      //开始填充参数
      Object[] params = new Object[2];
      //params[0] = new String("soda");
      params[0] = new String("soda");
      params[1] = new Integer(23);
      System.out.println("22222222222");
      //获取该class的实例
      Object obj = te.newInstance();
      //进行方法调用
      Object result = method.invoke(obj, params);
      System.out.println("结果:" + result);
    }
    catch (Exception e)
    {
      System.out.println(e);
    }
    
  }
}

컴파일하고 실행하면 해당 문자열을 다른 곳에서 전달된 데이터로 변경하는 것을 볼 수 있다. )

또 다른 방법으로는 배열 반사가 있습니다. 연구해 본 결과 약간의 차이가 있는 것으로 나타났습니다. 다들 잘 읽어보셔야 해요

/**
 * @(#)Test.java
 * 
 * @author soda E-mail:sujun10@21cn.com
 * @version 1.0
 * <br>Copyright (C), 2007 soda.C
 * <br>This program is protected by copyright laws.
 * <br>Program Name:FlashSyncServer
 * <br>Date:2007.1
 */
import java.lang.reflect.Method;
//这里我就不做什么解释了,和前面的几乎一样,大家也可以自己去查查api,Class类的api
public class Test 
{
  public void test(double[] dou)
  {
    System.out.println(dou.length);
    System.out.println(dou[0]);
  }
  public static void main(String[] args) throws Exception
  {
    try
    {
      Class[] cl = new Class[1];
      cl[0] = double[].class;
      System.out.println("cl[0]:" + cl[0]);
      Object[] in = new Object[1];
      //注意这里,不是Double[],而是double[]。这里不能用对象数组
      double[] db = new double[1];
      db[0] = 100.0;
      in[0] = db;
      Class te = Test.class;
      Method method = te.getMethod("test", cl);
      Object obj = te.newInstance();
      Object objs = method.invoke(obj, in);
    }
    catch (Exception e)
    {
      System.out.println(e);
    }
    
  }
}

그래요, 기본은 이렇습니다. 아무리 프로그램이 복잡해도 기초부터 진화한 것입니다.

이 기사는 Java 시작하기 칼럼에서 가져온 것입니다. 학습을 환영합니다!

위 내용은 Java의 반사 메커니즘(배열 매개변수 포함)에 대한 심층적인 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 word666.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제