java中的反射机制

一、java中获取java.lang.class对象操作方法

  1. 可以利用Class.forName("类的全路径")

  2. this.getClass()  //得到的是正在被调用的类

  3.对象.class

这三种方法获取的结果都是Class对象

二、关于反射的知识强化one

public class Test {
    public static void A1() {}
    public void A2() {}
    private void B1() {}
    private static void B2() {}
    public static void main(String[] args) {
        Class clazz = Test.class;
        System.out.println("clazz: "+clazz);//返回的Map集合
        System.out.println("clazz.getName(): "+clazz.getName());
        System.out.println("clazz.getSimpleName(): "+clazz.getSimpleName());
        for(Method method:clazz.getMethods()) {
            //数组类返回从 Object 类继承的所有(公共)member 方法(包括Object的方法)
            System.out.println("clazz.getMethods(): "+method.getName());
        }
    }
}

结果:

  强化只是two:

public class A {
    public A() {
        Class clazz = this.getClass();
        System.out.println(clazz);
    }
}
public class B extends A{
    public static void main(String[] args) {
        //new B
        B b = new B();//new B的时候会调用A的构造
        //new A
        A a = new A();
    }
}

 结果:

三、利用反射执行方法Method

import java.lang.reflect.Method;

public class TestClassLoad {
  public static void main(String[] args) throws Exception {
    Class<?> clz = Class.forName("A");
    Object o = clz.newInstance();
    Method m = clz.getMethod("foo", String.class);
    for (int i = 0; i < 16; i++) {
      m.invoke(o, Integer.toString(i));
    }
  }
}

  上面程序中可以将clz换为this.getClass()来执行获取Method对象,invoke(类对象,方法参数)

四、根据配置文件执行不同的类

public class Factory {
    private static Properties props;

    static {
    	System.out.println("静态代码块");
    	props = new Properties();
        try {
            props.load(new FileInputStream("./src/main/resources/config.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    {
    	System.out.println("非静态代码块");
    }
    public static User getUserInstance() throws Exception{
    	return (User) Class.forName(props.getProperty("user")).newInstance();
    }
    public static Car getCarInstance() throws Exception{
    	return (Car) Class.forName(props.getProperty("car")).newInstance();
    }
}

config.properties配置文件内容为:

user=com.it.entity.User
car=com.it.entity.Car

value的值是类的全路径

五、可以利用java的反射机制来实现Servlet的抽取

package com.iang.web.servlet.base;

import java.io.IOException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class BaseServlet extends HttpServlet{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		try {
			//1.获取方法名称
			String mName = request.getParameter("op");
			
			//1.1判断method参数是否为空,若为空执行默认的方法
			if(mName == null || mName.trim().length()==0) {
				mName = "index";
			}
			//2.获取方法对象
			Method method=this.getClass().getMethod(mName, HttpServletRequest.class, HttpServletResponse.class);
		
			//3.让方法执行,接受返回值
			String path=(String) method.invoke(this, request,response);
			
			//4.判断返回值是否为空,若不为空统一处理请求转发
			if(path!=null)
			{
				request.getRequestDispatcher(path).forward(request, response);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new RuntimeException();
		} 
		
	}
	
	public String index(HttpServletRequest request, HttpServletResponse response) throws IOException {
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().println("亲不要捣乱");
		return null;
	}
}

  下面是一个例子:

package com.iang.web.servlet;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.itwang.domain.News;
import com.itwang.domain.NewsCategory;
import com.itwang.service.NewsBusinessService;
import com.itwang.service.impl.NewsBusinessServiceImpl;
import com.itwang.web.servlet.base.BaseServlet;

/**
 * Servlet implementation class NewsManagerServlet
 */
@WebServlet("/NewsManagerServlet")
public class NewsManagerServlet extends BaseServlet {
	private static final long serialVersionUID = 1L;
    private NewsBusinessService nbs = new NewsBusinessServiceImpl();


	public String updateNews(HttpServletRequest request, HttpServletResponse response) {
		// TODO Auto-generated method stub
		String id=request.getParameter("id");
		String title=request.getParameter("title");
		String publicdate=request.getParameter("publicdate");
		String content=request.getParameter("content");
		String publicauthor=request.getParameter("publicauthor");
		String keywords=request.getParameter("keywords");
		String categoryid=request.getParameter("categoryid");
		NewsCategory newsCategory=nbs.findNewsCategoryById(categoryid);
		News news=new News();
		news.setCategory(newsCategory);
		news.setContent(content);
		news.setKeywords(keywords);
		news.setPublicauthor(publicauthor);
		news.setPublicdate(publicdate);
		news.setTitle(title);
		news.setId(id);
		nbs.updateNews(news);
		return null;
	}

	public String addNewsUI(HttpServletRequest request, HttpServletResponse response) {
		// TODO Auto-generated method stub
		List<NewsCategory> listNewsCategory=nbs.findAllNewsCategory();
		request.setAttribute("listNewsCategory", listNewsCategory);
		return "/admin/addNews.jsp";
	}
}

 

posted @ 2018-07-16 21:21  四季写爱  阅读(326)  评论(0编辑  收藏  举报