反射的原理

1.什么是反射?


反射是java语言的一种机制,利用反射机制动态的实例化对象(构造函数)、读写属性、调用方法。

反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)

2. 类类


   所有狗      狗类 Dog                 狗对象  二哈 

   所有猫      猫类 Cat                 猫对象  肥波
  
   所有类      类类 java.lang.Class     类对象 特定类

3.如何得到类对象


   一切反射相关的代码都从获得类对象开始
   3种获取方式:
     2.1 类名.class;
     2.2 对象名.getClass();
     2.3 Class.forName(全限定名/全路径名)(最常用)

 注1:ClassNotFoundException(类名错|少jar包)
  注2:同一类的、类对象只会创建一个

4.根据类得到类名(全限定名/全路径名)


    1)cName.getName();            -->获取全限定名
    2)cName.getSimpleName();         -->获取类名
    3)cName.getPackage();             -->获取包名

5.根据类得到类的属性


    Field field=cla.getField(“属性名”);

    field.getName();            -->获取属性名            
    filed.getType();            -->获取属性类型        
    field.getModifiers();            -->获取属性访问修饰符    
    field.set(Object,Object);         -->设置属性值,参数1:要设置属性所在对象;参数2:要设置的值;    
    field.get(Object);            -->获取属性值,参数:要获取属性值的对象                
    clazz.getDeclaredField(“属性名”);    -->获取单个属性(私有、公有、受保护、默认、静态)    
    clazz.getDeclaredFields();        -->获取所有属性(私有、公有、受保护、默认、静态)

6.根据类得到类的方法


    //无参无返回、无参有返回、有参无返回、有参有返回
    cla.getMethod();            -->获取单个公有方法
    cla.getDeclaredMethod();        -->获取当个方法(包括私有、受保护、默认、公有)
    cla.getMethods();            -->获取所有公有方法
    cla.getDeclaredMethods();        -->获取所有的方法(包括私有、受保护、默认、公有)

7.根据类得到类的构造方法


    cla.getConstrutor();            -->获取单个公有构造方法
    cla.getDeclaredConstrutor();        -->获取单个构造方法(包括私有、受保护、默认、公有)
    cla.getConstrutors();            -->获取所有的公有构造方法
    cla.getDeclaredConstrutors();        -->获取所有的构造方法(包括私有、受保护、默认、公有)

8.根据类得到类的实现接口列表


    Class[] interface=cla.getInterfaces();    -->获取类对象中所有实现接口列表

反射的原理_第1张图片

 让我们看看代码

先随便建一个实体类

package com.zking.text;

import java.io.Serializable;
import java.security.Principal;
import java.security.cert.Certificate;

import javax.net.ssl.SSLPeerUnverifiedException;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSessionContext;
import javax.security.cert.X509Certificate;
import javax.security.sasl.SaslClient;
import javax.security.sasl.SaslException;

public class Person extends Student implements Serializable, SaslClient, SSLSession {
	private Integer pid;
	private String pname;
	private String psex;
	@Override
	public int getApplicationBufferSize() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public String getCipherSuite() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public long getCreationTime() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public byte[] getId() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public long getLastAccessedTime() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public Certificate[] getLocalCertificates() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Principal getLocalPrincipal() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public int getPacketBufferSize() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public X509Certificate[] getPeerCertificateChain() throws SSLPeerUnverifiedException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Certificate[] getPeerCertificates() throws SSLPeerUnverifiedException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getPeerHost() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public int getPeerPort() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public Principal getPeerPrincipal() throws SSLPeerUnverifiedException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getProtocol() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public SSLSessionContext getSessionContext() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object getValue(String arg0) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String[] getValueNames() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void invalidate() {
		// TODO Auto-generated method stub

	}

	@Override
	public boolean isValid() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void putValue(String arg0, Object arg1) {
		// TODO Auto-generated method stub

	}

	@Override
	public void removeValue(String arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public String getMechanismName() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public boolean hasInitialResponse() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public byte[] evaluateChallenge(byte[] challenge) throws SaslException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public boolean isComplete() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public byte[] unwrap(byte[] incoming, int offset, int len) throws SaslException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public byte[] wrap(byte[] outgoing, int offset, int len) throws SaslException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object getNegotiatedProperty(String propName) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void dispose() throws SaslException {
		// TODO Auto-generated method stub

	}

}

然后反射出类里面所实现的接口,所有的方法和属性

package com.zking.text;

import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedType;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Dome05 {
	public static void main(String[] args) throws Exception {
		Class class1 = Person.class;//拿到类对象
		Class[] classes = class1.getInterfaces();//接口数组
		Field[] fields = class1.getDeclaredFields();//类中的属性数组
		Method[] methods = class1.getDeclaredMethods();//类的方法数组
		AnnotatedType annotatedSuperclass = class1.getAnnotatedSuperclass();//类的父类
		System.out.println(annotatedSuperclass.getType());
		for (Method method : methods) {
			System.out.println(method);
		}
		for (Field field : fields) {
			System.out.println(field);
		}
		for (Class class2 : classes) {
			System.out.println(class2);
		}
		Object per = class1.newInstance();
		System.out.println(per);
		Field field = class1.getDeclaredField("pid");
		field.setAccessible(true);
		field.set(per, 12);
		System.out.println(field.get(per));
	}
}

你可能感兴趣的:(java,p2p,linq,java)