java 반사 메커니즘 예시 상세

6683 단어 java반사
1. 반사란 무엇인가?하나의 종류는 여러 가지 구성 부분이 있는데 예를 들어 구성원 변수, 방법, 구조 방법 등이다.반사는 캐리어 클래스를 불러오고 클래스의 각 구성 부분을 해부하는 것이다.2. 불러오는 클래스 자바에는 클래스 클래스가 있습니다. 클래스를 대표하는 바이트 코드입니다.클래스 클래스가 클래스의 바이트 코드를 대표하는 이상, 클래스 바이트 코드를 불러오는 방법을 제공해야 합니다: forName ().이 방법은 어떤 종류의 바이트 코드를 메모리에 불러오고class 대상을 사용하여 봉인합니다.다른 2가지 클래스 대상을 얻는 방식: 클래스 이름.클래스 대상.getClass()
먼저 간단한 Person 클래스를 만듭니다

public class ReflectDemo { 
public static void main(String args[]) throws Exception 
{  //1. 
 Class clazz = Class.forName("dsa.Person") ; 

//2. 
Class clazz1 = new Person().getClass() ; 

//3. 
Classclazz2=Person.class;
}
}

3. 반사 구조 방법
Person 클래스:

/**
*
*/
publicPerson(){
System.out.println("null");
}

publicPerson(Stringname){
System.out.println(name);
}

publicPerson(Stringname,intpwd){
System.out.println(name+"+"+pwd);
}

privatePerson(Listlist){
System.out.println("List");
}

테스트 클래스:

// publicPerson()
@Test
publicvoidtest1()throwsException{
Classclazz=Class.forName("RflectorDemo.Person");
Constructorcr=clazz.getConstructor(null);//
Personp=(Person)cr.newInstance(null);//
//System.out.println(p.name);
}

// publicPerson(Stringname)
@Test
publicvoidtest2()throwsException{
Classclazz=Class.forName("RflectorDemo.Person");
Constructorcr=clazz.getConstructor(String.class);
Personp=(Person)cr.newInstance("haha");
System.out.println(p.name);
}

// publicPerson(Stringname,intpwd)
@Test
publicvoidtest3()throwsException{
Classclazz=Class.forName("RflectorDemo.Person");
Constructorcr=clazz.getConstructor(String.class,int.class);
Personp=(Person)cr.newInstance("haha",1);
//System.out.println(p.name);
}

// publicPerson(Listlist)
@Test
publicvoidtest4()throwsException{
Classclazz=Class.forName("RflectorDemo.Person");
Constructorcr=clazz.getDeclaredConstructor(List.class);
cr.setAccessible(true);//
Personp=(Person)cr.newInstance(newArrayList());
System.out.println(p.name);
}
// ,
@Test
publicvoidtest5()throwsException{
Classclazz=Class.forName("RflectorDemo.Person");

Personp=(Person)clazz.newInstance();
System.out.println(p.name);
}

구조 방법이 사유라면 우리는 폭력 해독을 한다!!!
4. 일반 반사 방법
Person 클래스 중:

/**
*
*/
publicvoidjf()
{

}
publicvoidjf(Stringname,intpwd)
{

}
publicClass[]jf(Stringname,int[]pwd)
{
returnnewClass[]{String.class,int.class};
}
privatevoidjf(InputStreamin)
{
System.out.println(in);
}
publicstaticvoidjf(intnum)
{
System.out.println(num);
}
publicstaticvoidmain(Stringargs[])
{
System.out.println("main!!!");
}

테스트 클래스 중:

/**
*
*
*@authortanlvxu
*
*/
publicclassDemo2{

// :publicvoidjf()
@Test
publicvoidtest1()throwsException{
Personp=newPerson();
Classclazz=Class.forName("RflectorDemo.Person");
Methodmethod=clazz.getMethod("jf",null);
method.invoke(p,null);
}

// :publicvoidjf(Stringname,intpwd)
@Test
publicvoidtest2()throwsException{
Personp=newPerson();
Classclazz=Class.forName("RflectorDemo.Person");
Methodmethod=clazz.getMethod("jf",String.class,int.class);
method.invoke(p,"dsa",30);
}

// :publicClass[]jf(Stringname,int[]pwd)
@Test
publicvoidtest3()throwsException{
Personp=newPerson();
Classclazz=Class.forName("RflectorDemo.Person");
Methodmethod=clazz.getMethod("jf",String.class,int[].class);
Classcs[]=(Class[])method.invoke(p,"aads",newint[]{1,2,3});
System.out.println(cs[0]);
}

// :privatevoidjf(InputStreamin)
@Test
publicvoidtest4()throwsException{
Personp=newPerson();
Classclazz=Class.forName("RflectorDemo.Person");
Methodmethod=clazz.getDeclaredMethod("jf",InputStream.class);
method.setAccessible(true);
method.invoke(p,newFileInputStream("d:\\qqClient.txt"));
}

// :publicstaticvoidjf(intnum)
@Test
publicvoidtest5()throwsException{
Classclazz=Class.forName("RflectorDemo.Person");
Methodmethod=clazz.getMethod("jf",int.class);
method.invoke(null,30);
}

// :publicstaticvoidm(intnum)
@Test
publicvoidtest6()throwsException{
Classclazz=Class.forName("RflectorDemo.Person");
Methodmethod=clazz.getMethod("main",String[].class);
//method.invoke(null,(Object)newString[]{"ds","das"});
method.invoke(null,newObject[]{newString[]{"ds","das"}});
}

5. 반사 필드
PerSon 클래스:

/**
*
*/
publicStringname="swr";
privateintpassword=45;
privatestaticintage=35;

Java
/**
*
*@authortanlvxu
*
*/
publicclassDemo3{
/**
* publicStringname="swr";
*@throwsException
*/
@Test
publicvoidtest1()throwsException
{
Personp=newPerson();
Classclazz=Class.forName("RflectorDemo.Person");
Fieldf=clazz.getField("name");
//
Objectvalue=f.get(p);
//
Classtype=f.getType();
if(type.equals(String.class)){
Stringname=(String)f.get(p);
System.out.println(name);
}

//
f.set(p,"dfafa");
System.out.println(p.name);

}

/**
* privateintpassword;
*@throwsException
*/
@Test
publicvoidtest2()throwsException
{
Personp=newPerson();
Classclazz=Class.forName("RflectorDemo.Person");
Fieldf=clazz.getDeclaredField("password");
f.setAccessible(true);
f.set(p,36);
System.out.println(f.get(p));

}

/**
* privatestaticintage=35;
*@throwsException
*/
@Test
publicvoidtest3()throwsException
{
Classclazz=Class.forName("RflectorDemo.Person");
Fieldf=clazz.getDeclaredField("age");
f.setAccessible(true);
f.set(null,24);
System.out.println(f.get(null));

}

사실 반사 구조 방법이나 필드가 대체적으로 같든지 간에 우리는 하나를 반삼할 수 있다.

좋은 웹페이지 즐겨찾기