>  기사  >  Java  >  Java의 배열 매개변수를 포함하는 반사 메커니즘에 대한 자세한 설명

Java의 배열 매개변수를 포함하는 반사 메커니즘에 대한 자세한 설명

黄舟
黄舟원래의
2017-10-12 10:10:421177검색

이 글은 주로 Java의 반사 메커니즘(배열 매개변수 포함)에 대한 자세한 설명에 대한 관련 정보를 소개합니다. 이 부분을 이해하고 익히는 데 도움이 되기를 바랍니다. Java 메커니즘의 반사(배열 매개변수 포함)

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

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

여기서 제가 말씀드리고 싶은 것은 문자열에 따라 원하는 작업을 수행하면(동적으로 실행하는 것도 포함) 해당 메서드, 해당 클래스 생성), 데이터를 전송할 때 대부분 문자열(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의 배열 매개변수를 포함하는 반사 메커니즘에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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