反射的具体应用反射出方法和类等等

  首先建立一个类,里面有各种各样的方法的字段,然后用反射来调用,调用的时候用junit来测试

package com.fts.reflect;

import java.io.InputStream;
import java.util.List;

public class Person {
	public String name="first test";
	private int passwd=123;
	private static int age=100;
	
	
	
	public Person(){
		System.out.println("person");
	}
	public Person(String name){
		System.out.println("person name:"+name);
	}
	public Person(String name,int passwd){
		System.out.println("person name:"+name+"  passwd:"+passwd);
	}
    private Person(List list){
    	System.out.println("list");
    }
    public void test(){
    	System.out.println("test");
    }
    public void test(String name,int passwd){
    	System.out.println("test:"+name+"   :"+passwd);
    }
    public Class[] test(String name,int[] passwd){
    	return new Class[]{String.class};
    }
    private void test(InputStream in){
    	System.out.println(in);
    }
    public static void test(int num){
    	System.out.println(num);
    }
    public static void main(String[] args){
    	System.out.println("main method");
    }
}

反射,加载类的三种方法

package com.fts.reflect;

public class Demo1 {

	/**
	 * 反射,加载类,获得类的字节码
	 * @param args
	 * @throws ClassNotFoundException 
	 */
	public static void main(String[] args) throws ClassNotFoundException {
		// TODO Auto-generated method stub
        //方法一
		Class clazz=Class.forName("com.fts.reflect.Person");
	    
		//方法二
		Class clazz1=new Person().getClass();
		
		//方法三
		Class clazz2=Person.class;
	
	    System.out.println(clazz==clazz1);
	    System.out.println(clazz1==clazz2);
	}

}

反射出构造函数

package com.fts.reflect;

import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

/*
 * 解剖构造函数,创建类的对象
 */
public class Demo2 {
	//反射构造函数 public Person(){}
	@Test
	public void test1() throws Exception{
		//将类加载进内存中
		Class clazz=Class.forName("com.fts.reflect.Person");
		//解剖构造函数
		Constructor c=clazz.getConstructor(null);
		//创建一个对象
		Person p=(Person) c.newInstance(null);
		System.out.println(p.name);
		
	}
	//反射构造函数 public Person(string name){}
	@Test
	public void test2() throws Exception{
		//将类加载进内存中
		Class clazz=Class.forName("com.fts.reflect.Person");
		//解剖构造函数
		Constructor c=clazz.getConstructor(String.class);
		//创建一个对象
		Person p=(Person) c.newInstance("my name");
		System.out.println(p.name);
		
	}
	//反射构造函数 public Person(string name,int passwd){}
	@Test
	public void test3() throws Exception{
		//将类加载进内存中
		Class clazz=Class.forName("com.fts.reflect.Person");
		//解剖构造函数
		Constructor c=clazz.getConstructor(String.class,int.class);
		//创建一个对象
		Person p=(Person) c.newInstance("my name",888888);
		System.out.println(p.name);
		
	}
	//反射构造函数 private Person(List list){}
	@Test
	public void test4() throws Exception{
		//将类加载进内存中
		Class clazz=Class.forName("com.fts.reflect.Person");
		//解剖构造函数
		Constructor c=clazz.getDeclaredConstructor(List.class);
		c.setAccessible(true);//暴力强暴打开
		//创建一个对象
		Person p=(Person) c.newInstance(new ArrayList());
		System.out.println(p.name);
		
	}
	//创建对象的另一种形式
	@Test
	public void test5() throws Exception{
		//将类加载进内存中
		Class clazz=Class.forName("com.fts.reflect.Person");
		Person p=(Person) clazz.newInstance();
		System.out.println(p);
		
		
	}

}

反射类的其它方法

package com.fts.reflect;

import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Method;

import org.junit.Test;

//反射类的方法
public class Demo3 {
	//反射类的方法 public void test(){}
	@Test
	public void test1() throws Exception{
		Person p=new Person();
		//将类加载在内存中
		Class clazz=Class.forName("com.fts.reflect.Person");
	    //加载类的方法
		Method method=clazz.getMethod("test",null);
		method.invoke(p, null);
	
	}
	//反射类的方法 public void test(String name,int passwd){}
	@Test
	public void test2() throws Exception{
		Person p=new Person();
		//将类加载在内存中
		Class clazz=Class.forName("com.fts.reflect.Person");
	    //加载类的方法
		Method method=clazz.getMethod("test",String.class,int.class);
		method.invoke(p, "fengtansong",100);
	
	}
	//反射类的方法 public Class[] test(String name,int[] passwd)
	@Test
	public void test3() throws Exception{
		Person p=new Person();
		//将类加载在内存中
		Class clazz=Class.forName("com.fts.reflect.Person");
	    //加载类的方法
		Method method=clazz.getMethod("test",String.class,int[].class);
		Class cs[]=(Class[]) method.invoke(p, "fengtansong",new int[]{1,2,3});
	    System.out.println(cs[0]);
	}
	//反射类的方法 private void test(InputStream in)
	@Test
	public void test4() throws Exception{
		Person p=new Person();
		//将类加载在内存中
		Class clazz=Class.forName("com.fts.reflect.Person");
	    //加载类的方法
		Method method=clazz.getDeclaredMethod("test",InputStream.class);
		method.setAccessible(true);
		method.invoke(p,new FileInputStream("c:\\1.txt"));
		
	}
	//反射类的方法 public static void test(int num)
	@Test
	public void test5() throws Exception{
		//将类加载在内存中
		Class clazz=Class.forName("com.fts.reflect.Person");
	    //加载类的方法
		Method method=clazz.getMethod("test",int.class);
		//静态方法调用不需要对象
		method.invoke(null,1000);
		
	}
	//反射类的方法 public static void main(String[] args)
	@Test
	public void test6() throws Exception{
		//将类加载在内存中
		Class clazz=Class.forName("com.fts.reflect.Person");
	    //加载类的方法
		Method method=clazz.getMethod("main",String[].class);
		//静态方法调用不需要对象
		//method.invoke(null,new Object[]{new String[]{"1"}});
		method.invoke(null,(Object)new String[]{"1"});
		
	}

}

反射出字段

package com.fts.reflect;

import java.lang.reflect.Field;

import org.junit.Test;

//反射字段
public class Demo4 {
	//反射字段public String name="first test";
	@Test
	public void test1() throws Exception{
		Person p=new Person();
		//将类加载到内存中
		Class clazz=Class.forName("com.fts.reflect.Person");
	    Field f=clazz.getField("name");	
	    //String name=(String) f.get(p);
	    //System.out.println(name);
	   // Class type=f.getType();
	   // System.out.println(type);
	    //获取字段的值
	    Object value=f.get(p);
	    //获取字段的类型
	    Class type=f.getType();
	    if(type.equals(String.class)){
	    	String svalue=(String) value;
	    	System.out.println(svalue);
	    }
	    
	    //设置字段的值
	    f.set(p,"xxxxxxxxxx");
	    System.out.println(p.name);
	}
	//反射字段private int passwd=123;
	@Test
	public void test2() throws Exception{
		Person p=new Person();
		//将类加载到内存中
		Class clazz=Class.forName("com.fts.reflect.Person");
	   //获得对象
		Field f=clazz.getDeclaredField("passwd");
		f.setAccessible(true);
		System.out.println(f.get(p));
	}
	//反射字段private static int age=100;
	@Test
	public void test3() throws Exception{
		Person p=new Person();
		//将类加载到内存中
		Class clazz=Class.forName("com.fts.reflect.Person");
	   //获得对象
		Field f=clazz.getDeclaredField("age");
		f.setAccessible(true);
		System.out.println(f.get(p));
	}

}
通过以上的例子简单理解了反射的应用

在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中:
Class类:代表一个类。
Field 类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor 类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
 
一、通过Class类获取成员变量、成员方法、接口、超类、构造方法等
 
在java.lang.Object 类中定义了getClass()方法,因此对于任意一个Java对象,都可以通过此方法获得对象的类型。Class类是Reflection API 中的核心类,它有以下方法
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值