亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 編程 > Java > 正文

工作中常用到的Java反射

2019-11-11 07:53:36
字體:
供稿:網(wǎng)友

學(xué)習(xí)java的同學(xué)注意了?。?! 學(xué)習(xí)過程中遇到什么問題或者想獲取學(xué)習(xí)資源的話,歡迎加入Java學(xué)習(xí)交流群,群號(hào)碼:183993990  我們一起學(xué)Java!

這次提到的Java反射涉及的代碼比較多。因?yàn)楣ぷ髦薪?jīng)常用到反射,對(duì)代碼做了很多抽象以及過濾器。雖然代碼量很多,但是簡(jiǎn)單易用,過濾插件也易修改。

下面介紹下工作中哪些地方比較容易用到反射。比如插件或者過濾器,如果抽象的子類比較少,配置成xml等結(jié)構(gòu)也是可以達(dá)到同樣的效果。如果希望靈活一些,添加了插件或者過濾器代碼子類后希望可以直接使用??赡芊瓷鋾?huì)比較好點(diǎn),通過掃描所有class或者jar文件,得到所有繼承的子類。如果每次調(diào)用都掃描所有的文件會(huì)比較影響性能。所以在實(shí)現(xiàn)里面加入反射緩存,對(duì)所要獲取反射子類時(shí)涉及的所有參數(shù)作為一個(gè)key緩存所有的反射結(jié)果。下次如果是同樣的key,就不在重新掃描。

代碼示例如下:

public static void main(String[] args) {		//設(shè)置掃描范圍,可以是class文件所在位置例如bin下或者是MySQL開頭或者mysql結(jié)尾的jar,		//設(shè)置為""為全部都掃描,這種比較耗時(shí)		ReflectUtils.createSharedReflections("classes", "bin", "mysql");		try {			//調(diào)試階段可以設(shè)置每次都全掃描			//Beans.setDesignTime(true);			final Collection<String> subTypes = ReflectUtils.listSubClass(IA.class);//			for (final String subType : subTypes) {				//這里獲取的是所有繼承IA的子類				System.out.PRintln(subType);				final IA impl = ReflectUtils.initClass(subType, IA.class);				if (null == impl)					continue;				//通過該方式,可以統(tǒng)一做操作,				impl.print();			}		} catch (Exception e) {			e.printStackTrace();		}	}

代碼執(zhí)行結(jié)果:

//緩存文件,避免每次調(diào)用反射都重新掃描//如果刪除該文件,再次調(diào)用反射時(shí),會(huì)重新掃描,一般會(huì)在代碼里面有添加子類的時(shí)候會(huì)刪除該文件XmlUtils.readXml failure:./configuration.REF (系統(tǒng)找不到指定的文件。)net.simple.reflect.test.Bnet.simple.reflect.test.Bnet.simple.reflect.test.Dnet.simple.reflect.test.V

具體的類里面如何實(shí)現(xiàn)的大家就看下源碼吧,這里貼出兩個(gè)核心類的代碼。源碼地址:https://git.oschina.net/eliyanfei/api_tools

package net.simple.reflect;import java.io.File;import java.io.IOException;import java.net.JarURLConnection;import java.net.URL;import java.net.URLDecoder;import java.util.ArrayList;import java.util.Collection;import java.util.Enumeration;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;import java.util.concurrent.TimeUnit;import java.util.jar.JarEntry;import java.util.jar.JarFile;import java.util.zip.ZipEntry;import net.simple.reflect.filter.IPathURLFilter;import net.simple.reflect.filter.ISubTypeFilter;import net.simple.reflect.filter.ITypeFilter;import org.w3c.dom.Document;import org.w3c.dom.Element;/** *  * @author 李巖飛 * @email eliyanfei@126.com	 * 2016年11月2日 下午3:23:49 * */public final class Reflections {	private final Collection<URL> pathUrls;	private final Collection<IPathURLFilter> pathURLfilters;	private final Collection<ITypeFilter> typeFilters;	private ISubTypeFilter subTypeFilter;	public Reflections() {		typeFilters = new ArrayList<ITypeFilter>();		pathURLfilters = new ArrayList<IPathURLFilter>();		this.pathUrls = ClasspathHelper.getUrlsForCurrentClasspath();	}	public Reflections(final Collection<URL> pathUrls) {		this.pathUrls = pathUrls;		typeFilters = new ArrayList<ITypeFilter>();		pathURLfilters = new ArrayList<IPathURLFilter>();	}	/**	 * @param subTypeFilter	 *            the subTypeFilter to set	 */	public void setSubTypeFilter(final ISubTypeFilter subTypeFilter) {		this.subTypeFilter = subTypeFilter;	}	/**	 * @return the subTypeFilter	 */	public ISubTypeFilter getSubTypeFilter() {		return subTypeFilter;	}	public Reflections addPathURLFilter(final IPathURLFilter pathURLFilter) {		if (null == pathURLFilter)			return this;		if (!this.pathURLfilters.contains(pathURLFilter))			this.pathURLfilters.add(pathURLFilter);		return this;	}	public Reflections addTypeFilter(final ITypeFilter typeFilter) {		if (null == typeFilter)			return this;		if (!this.typeFilters.contains(typeFilter))			this.typeFilters.add(typeFilter);		return this;	}	private static final String histFile = "./configuration.REF";	private Document histDom;	public Collection<String> getSubTypesFast(final Class<?> baseType) {//, final String... typeNames		//首先過濾出當(dāng)前允許掃描的路徑		final StringBuilder bufPathsId = new StringBuilder(32);		final Map<File, URL> fileUrls = new LinkedHashMap<File, URL>(8);		for (final URL pathUrl : pathUrls) {			if (!acceptPathUrl(pathUrl))				continue;			File file = null;			try {				file = new File(URLDecoder.decode(pathUrl.getFile(), "UTF-8"));			} catch (final Exception e) {				file = new File(pathUrl.getFile());			}			fileUrls.put(file, pathUrl);			if (!file.exists())//is url file?ignore				continue;			bufPathsId.append(file.getName()).append(file.lastModified());		}		final String domId = md5.getHashString(bufPathsId.toString());		if (null == histDom)			histDom = W3cUtils.readXml(histFile);		if (null == histDom)			histDom = W3cUtils.newDom("R");		Element rootEle = histDom.getDocumentElement();		if (null == rootEle)			histDom.appendChild(rootEle = histDom.createElement("R"));		if (!domId.equals(rootEle.getAttribute("id"))) {			rootEle.getParentNode().removeChild(rootEle);			histDom.appendChild(rootEle = histDom.createElement("R"));			rootEle.setAttribute("id", domId);		}		final String baseTypeId = MD5.getHashString(baseType.getName());		Element refEle = W3cUtils.firstChildElement(rootEle, "E", "id", baseTypeId);		if (null != refEle) {			final List<Element> valueEles = W3cUtils.childElementList(refEle, "F");			final Collection<String> result = new ArrayList<String>(valueEles.size());			for (final Element valueEle : valueEles) {				result.add(new String(Base64.decodeFast(valueEle.getAttribute("id"))));			}			return result;		}		final ThreadPool<ListSubTypes> pool = new ThreadPool<ListSubTypes>();		for (final File fileKey : fileUrls.keySet()) {			pool.execute(new ListSubTypes(baseType, fileKey, fileUrls.get(fileKey)));		}		try {			pool.shutdown(3, TimeUnit.MINUTES);		} catch (final InterruptedException e) {			e.printStackTrace();//for debug		}		final Collection<String> result = new ArrayList<String>();		for (final ListSubTypes task : pool.getThreadRunables()) {			result.addAll(task.result);		}		refEle = W3cUtils.addEle(rootEle, "E");		refEle.setAttribute("id", baseTypeId);		for (final String itm : result) {			W3cUtils.addEle(refEle, "F").setAttribute("id", Base64.encodeToString(itm.getBytes(), false));		}		try {			W3cUtils.writeXmlDocument(histFile, histDom);		} catch (final Exception e) {		}		return result;	}	/**	 * @see {@link ReflectUtils#createSharedReflections(String...)}	 * @see {@link ReflectUtils#setSharedReflections(Reflections)}	 * @see {@link ReflectUtils#listSubClass(Class)}	 * @param baseType	 * @return	 */	public Collection<String> getSubTypes(final Class<?> baseType, final String... typeNames) {//		final ThreadPool<ListSubTypes> pool = new ThreadPool<ListSubTypes>();		for (final URL pathUrl : pathUrls) {			if (!acceptPathUrl(pathUrl))				continue;			File file = null;			try {				file = new File(URLDecoder.decode(pathUrl.getFile(), "UTF-8"));			} catch (final Exception e) {				file = new File(pathUrl.getFile());			}			pool.execute(new ListSubTypes(baseType, file, pathUrl, typeNames));		}		try {			pool.shutdown(3, TimeUnit.MINUTES);		} catch (final InterruptedException e) {			e.printStackTrace();//for debug		}		final Collection<String> result = new ArrayList<String>();		for (final ListSubTypes task : pool.getThreadRunables()) {			result.addAll(task.result);		}		return result;	}	class ListSubTypes implements Runnable {		final File file;		final Class<?> baseType;		final URL pathUrl;		final String[] typeNames;		public ListSubTypes(final Class<?> baseType, final File file, final URL pathUrl, final String... typeNames) {			this.baseType = baseType;			this.file = file;			this.pathUrl = pathUrl;			this.typeNames = typeNames;		}		Collection<String> result = new ArrayList<String>(4);		@Override		public void run() {			if (file.isDirectory()) {				listSubTypesFromDirectory(file, baseType, pathUrl, file, result, typeNames);			} else				listSubTypesFromJar(baseType, pathUrl, result, typeNames);		}	}	/**	 * @param baseType	 * @param pathUrl	 * @param result	 */	public void listSubTypesFromDirectory(final File baseDirectory, final Class<?> baseType, final URL pathUrl, final File directory,			final Collection<String> result, final String... typeNames) {		File[] files = directory.listFiles();		if (null == files)			files = new File[] {};		String clazzPath;		final int baseDirLen = baseDirectory.getAbsolutePath().length() + 1;		for (final File file : files) {			if (file.isDirectory()) {				listSubTypesFromDirectory(baseDirectory, baseType, pathUrl, file, result, typeNames);			} else {				clazzPath = file.getAbsolutePath().substring(baseDirLen);				clazzPath = clazzPath.replace('//', '/');				doTypesFilter(baseType, pathUrl, result, clazzPath, typeNames);			}		}	}	/**	 * @param baseType	 * @param pathUrl	 * @param result	 */	public void listSubTypesFromJar(final Class<?> baseType, URL pathUrl, final Collection<String> result, final String... typeNames) {		try {			// It does not work with the filesystem: we must			// be in the case of a package contained in a jar file.			JarFile jarFile = null;			try {				if ("file".equals(pathUrl.getProtocol()))					pathUrl = new URL("jar:" + pathUrl.toExternalForm() + "!/");				jarFile = ((JarURLConnection) pathUrl.openConnection()).getJarFile();			} catch (final Exception e) {				final String filePath = pathUrl.getFile();				// if on win platform				if (filePath.indexOf(':') != -1) {					if (pathUrl.getFile().charAt(0) == '/')						jarFile = new JarFile(filePath.substring(1));				}				if (null == jarFile)					jarFile = new JarFile(filePath);			}			final Enumeration<JarEntry> e = jarFile.entries();			ZipEntry entry;			while (e.hasMoreElements()) {				entry = e.nextElement();				doTypesFilter(baseType, pathUrl, result, entry.getName(), typeNames);			}		} catch (final IOException ioex) {		}	}	private void doTypesFilter(final Class<?> baseType, final URL pathUrl, final Collection<String> result, final String clazzPath,			final String... typeNames) {		if (!clazzPath.endsWith(".class"))			return;		final int lastDotIdx = clazzPath.lastIndexOf('.');		if (-1 == lastDotIdx)			return;		final String typeDef = clazzPath.substring(0, lastDotIdx).replace('/', '.');		if (null != typeNames && typeNames.length > 0) {			final int lastDot = typeDef.lastIndexOf('.');			if (lastDot == -1)				return;			final String typeName = typeDef.substring(lastDot + 1);			boolean withLiked = false;			for (final String tmpTypeName : typeNames) {				if (!typeName.contains(tmpTypeName))					continue;				withLiked = true;				break;			}			if (withLiked == false)				return;		}		if (this.typeFilters.isEmpty()) {			if (null == this.subTypeFilter || this.subTypeFilter.accept(baseType, pathUrl, clazzPath))				result.add(typeDef);		} else {			for (final ITypeFilter typeFilter : this.typeFilters) {				if (!typeFilter.accept(clazzPath))					continue;				if (null == this.subTypeFilter || this.subTypeFilter.accept(baseType, pathUrl, clazzPath))					result.add(typeDef);			}		}	}	/**	 * @param pathUrl	 * @return	 */	private boolean acceptPathUrl(final URL pathUrl) {		if (this.pathURLfilters.isEmpty())			return true;		for (final IPathURLFilter pathURLFilter : this.pathURLfilters) {			if (pathURLFilter.accept(pathUrl))				return true;		}		return false;	}}
package net.simple.reflect;import java.beans.Beans;import java.io.File;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.net.JarURLConnection;import java.net.URL;import java.net.URLDecoder;import java.util.ArrayList;import java.util.Collection;import java.util.Collections;import java.util.Enumeration;import java.util.List;import java.util.jar.JarEntry;import java.util.jar.JarFile;import java.util.zip.ZipEntry;import net.simple.reflect.filter.PathURLFilter;import net.simple.reflect.filter.SampleSubInstanceFilter;import net.simple.reflect.filter.TypeFilter;/** *  * @author 李巖飛 * @email eliyanfei@126.com	 * 2016年11月2日 下午3:24:02 * */public final class ReflectUtils {	public static final String VAR_START_FLAG = "${";	public static final String VAR_END_FLAG = "}";	private static Reflections sharedReflections;	static final Collection<String> EMP_COLL = Collections.emptyList();	public static final void createSharedReflections(final String... filterExts) {		final Reflections refs = new Reflections();		refs.addPathURLFilter(new PathURLFilter(filterExts));//		refs.addTypeFilter(TypeFilter.DEFAULT);		refs.setSubTypeFilter(SampleSubInstanceFilter.DEFAULT);		ReflectUtils.setSharedReflections(refs);	}	/**	 * 此方法用于綁定一個(gè)通用的共享類型遍列工具.	 * @param sharedReflections	 */	public static final void setSharedReflections(final Reflections sharedReflections) {		ReflectUtils.sharedReflections = sharedReflections;	}	/**	 * 調(diào)用此方法之前必須先設(shè)置共享的類型遍列工具,參考:{@link #setSharedReflections(Reflections)},	 * 此方法主要使更方便的遍列給定類的實(shí)現(xiàn),	 */	public static final Collection<String> listSubClass(final Class<?> baseType, final String... typeNames) {//		if (null == sharedReflections)			return EMP_COLL;		//調(diào)用階段由于可能增加新的子類實(shí)現(xiàn),需要每次都重新掃描,只有在發(fā)布的產(chǎn)品時(shí)使用保存記錄的方法以提高啟動(dòng)速度.		return Beans.isDesignTime() ? sharedReflections.getSubTypes(baseType, typeNames) : sharedReflections.getSubTypesFast(baseType);	}	public static List<Class<?>> listClassOfPackage(final Class<?> cType, final String extenion) {		final List<Class<?>> result = new ArrayList<Class<?>>();		final List<String> cPath = ReflectUtils.listClassCanonicalNameOfPackage(cType, extenion);		for (final String path : cPath) {			try {				result.add(Class.forName(path, false, Thread.currentThread().getContextClassLoader()));			} catch (final Exception e) {				// ignore			}		}		return result;	}	public static List<String> listClassCanonicalNameOfPackage(final Class<?> clazz, final String extenion) {		return ReflectUtils.listNameOfPackage(clazz, extenion, true);	}	public static List<String> listClassNameOfPackage(final Class<?> clazz, final String extenion) {		return ReflectUtils.listNameOfPackage(clazz, extenion, false);	}	public static List<String> listNameOfPackage(final Class<?> clazz, final String extenion, final boolean fullPkgName) {		return ReflectUtils.listNameOfPackage(clazz.getName().replace('.', '/') + ".class", extenion, fullPkgName);	}	public static List<String> listNameOfPackage(final String clazzPkg, final String extenion, final boolean fullPkgName) {		final List<String> result = new ArrayList<String>();		final StringBuffer pkgBuf = new StringBuffer(clazzPkg);		if (pkgBuf.charAt(0) != '/')			pkgBuf.insert(0, '/');		final URL urlPath = ReflectUtils.class.getResource(pkgBuf.toString());		if (null == urlPath)			return result;		String checkedExtenion = extenion;		if (!extenion.endsWith(".class"))			checkedExtenion = extenion + ".class";		if (pkgBuf.toString().endsWith(".class"))			pkgBuf.delete(pkgBuf.lastIndexOf("/"), pkgBuf.length());		pkgBuf.deleteCharAt(0);		final StringBuffer fileUrl = new StringBuffer();		try {			fileUrl.append(URLDecoder.decode(urlPath.toExternalForm(), "UTF-8"));		} catch (final UnsupportedEncodingException e1) {			fileUrl.append(urlPath.toExternalForm());		}		if (fileUrl.toString().startsWith("file:")) {			fileUrl.delete(0, 5);// delete file: flag			if (fileUrl.indexOf(":") != -1)				fileUrl.deleteCharAt(0);// delete flag			final String baseDir = fileUrl.substring(0, fileUrl.lastIndexOf("classes") + 8);			ReflectUtils.doListNameOfPackageInDirectory(new File(baseDir), new File(baseDir), result, pkgBuf.toString(), checkedExtenion, fullPkgName);		} else {			ReflectUtils.doListNameOfPackageInJar(urlPath, urlPath, result, pkgBuf.toString(), checkedExtenion, fullPkgName);		}		return result;	}	/**	 */	private static void doListNameOfPackageInJar(final URL baseUrl, final URL urlPath, final List<String> result, final String clazzPkg, final String extenion, final boolean fullPkgName) {		try {			// It does not work with the filesystem: we must			// be in the case of a package contained in a jar file.			final JarURLConnection conn = (JarURLConnection) urlPath.openConnection();			final JarFile jfile = conn.getJarFile();			final Enumeration<JarEntry> e = jfile.entries();			ZipEntry entry;			String entryname;			while (e.hasMoreElements()) {				entry = e.nextElement();				entryname = entry.getName();				if (entryname.startsWith(clazzPkg) && entryname.endsWith(extenion)) {					if (fullPkgName)						result.add(entryname.substring(0, entryname.lastIndexOf('.')).replace('/', '.'));					else						result.add(entryname.substring(entryname.lastIndexOf('/') + 1, entryname.lastIndexOf('.')));				}			}		} catch (final IOException ioex) {		}	}	private static void doListNameOfPackageInDirectory(final File baseDirectory, final File directory, final List<String> result, final String clazzPkg, final String extenion,			final boolean fullPkgName) {		File[] files = directory.listFiles();		if (null == files)			files = new File[] {};		String clazzPath;		final int baseDirLen = baseDirectory.getAbsolutePath().length() + 1;		for (final File file : files) {			if (file.isDirectory()) {				ReflectUtils.doListNameOfPackageInDirectory(baseDirectory, file, result, clazzPkg, extenion, fullPkgName);			} else {				if (!file.getName().endsWith(extenion))					continue;				if (fullPkgName) {					clazzPath = file.getAbsolutePath().substring(baseDirLen);					clazzPath = clazzPath.substring(0, clazzPath.length() - 6);					result.add(clazzPath.replace(File.separatorChar, '.'));				} else {					result.add(file.getName().substring(0, file.getName().length() - 6));				}			}		}	}	public static final <T> T initClass(final String implClass, final Class<T> tType) {		return ReflectUtils.initClass(implClass, tType, true);	}	public static final <T> T initClass(final String implClass, final Class<T> tType, final boolean doInit) {		try {			final Object object = Class.forName(implClass, doInit, Thread.currentThread().getContextClassLoader()).newInstance();			return tType.cast(object);		} catch (final Throwable e) {			return null;		}	}}

學(xué)習(xí)Java的同學(xué)注意了?。。?nbsp;學(xué)習(xí)過程中遇到什么問題或者想獲取學(xué)習(xí)資源的話,歡迎加入Java學(xué)習(xí)交流群,群號(hào)碼:183993990  我們一起學(xué)Java!


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
欧美激情性爽国产精品17p| 欧美日韩在线播放三区四区| 7777精品伊人久久久大香线蕉的| 二区视频在线观看| 日本视频网址| av在线最新| 黑人乱码一区二区三区av| 99久热在线精品996热是什么| 亚洲伦理电影| 国产精品123| 欧美精品欧美极品欧美激情| 国产亚洲视频在线观看| 国产精品美女久久久久久久久| av在线电影播放| 日本欧美在线看| 黄色片网站在线免费观看| 97久久精品人人澡人人爽| 9765激情中文在线| 美女在线视频免费| 欧美精品欧美精品系列c| 亚洲 欧美 变态 另类 综合| 99在线观看免费| 欧美中日韩免费视频| 成年女人免费视频| 国产成人综合在线播放| 日韩欧美一区二区三区在线观看| 狠狠色狠狠色综合人人| 一区二区精品免费| www.成人爱| 亚洲人精品午夜射精日韩| 最新亚洲伊人网| 欧美成人aaa片一区国产精品| 欧美精品在欧美一区二区| 亚洲v在线观看| 中文av一区二区| 黄色成人免费观看| 九色国产蝌蚪视频| 亚洲国产精品久久久久| 亚洲精品国产suv一区88| 欧美国产日韩亚洲一区| 免费人成短视频在线观看网站| 精品视频在线观看一区二区| 亚洲国产精品黑人久久久| 国产成人精品在线播放| 99久久er热在这里只有精品15| 黑人巨大精品欧美一区二区一视频| 亚洲一区二区在线免费观看| 国产成人麻豆免费观看| 色综合久久天天综线观看| av成人免费观看| dy888夜精品国产专区| 香蕉久久国产| 99久久免费看精品国产一区| 亚洲av少妇一区二区在线观看| 中文字幕第36页| 日本成人xxx| 2022成人影院| 日日骚欧美日韩| 欧美日韩一本| 麻豆国产在线播放| 调教视频免费在线观看| 久久久久久久久丰满| 亚洲一级av无码毛片精品| 中文字幕免费观看| 看成年女人免费午夜视频| 亚洲中字在线| 九九亚洲视频| 五月综合久久| 2222www色视频在线观看| 在免费jizzjizz在线视频| 久久av老司机精品网站导航| 9.1人成人免费视频网站| 精品欧美一区二区三区在线观看| 精品少妇一区二区三区在线视频| 久久这里只有精品8| 色先锋资源网| 26uuu亚洲电影| 国产无遮挡裸体视频在线观看| 国产精品老女人视频| 欧日韩精品视频| 成人性生生活性生交12| 麻豆精品不卡国产免费看| 色综合色狠狠综合色| 九色蝌蚪在线视频| 精品国产免费久久久久久尖叫| 永久免费不卡在线观看黄网站| 欧美日韩亚洲国产成人| 欧美情侣在线播放| 欧美中文一区| 中国china体内裑精亚洲片| 奇米一区二区三区四区久久| 免费久久99精品国产自| 黄色春季福利在线看| 亚洲人精品午夜| 国产美女作爱全过程免费视频| 乳奴隷乳フ辱julia在线观看| 国产免费黄色| 97视频国产在线| 妖精视频在线观看| 色噜噜狠狠色综合网图区| sese在线播放| 国产午夜亚洲精品理论片色戒| 国产精品网在线观看| 精品捆绑调教一区二区三区| 久久99蜜桃精品久久久久小说| 日韩三级免费| 中出嫩模无套| 日本最新不卡在线| 97精品国产97久久久久久| 午夜国产一区| 亚洲人成人99网站| 最新国产乱人伦偷精品免费网站| 欧美性猛交xxxxx免费看| 6080yy精品一区二区三区| 国产视频三区四区| 91精品国产一区二区三区动漫| 日本一区二区免费不卡| 国产麻豆一精品一男同| 久久精品水蜜桃av综合天堂| 亚洲精品乱码久久久久久不卡| 日韩在线一区二区三区四区| 青青草精品在线| 国产91丝袜在线播放九色| av日韩在线播放| 91成人在线精品视频| 97欧美成人| 国产精品免费99久久久| av午夜在线观看| 水蜜桃av无码| 懂色av一区二区三区在线播放| 欧美三级电影在线播放| 91精品久久久久久久久久不卡| 成人福利网站在线观看| 国偷自产av一区二区三区麻豆| 五月天婷婷丁香网| 波多野结衣在线影院| 亚洲高清在线看| 国产精品1区2区3区在线观看| 久久精品女人天堂av免费观看| 男女做暖暖视频| 国产精品成人一区| 欧美黄色网视频| 久久久久久免费精品| 欧美无砖专区一中文字| 成年人网站在线观看视频| 8x8x最新地址| 91精品国产欧美一区二区成人| 久久久久亚洲av成人片| 久久免费在线观看| 日韩精品福利片午夜免费观看| 深夜福利网站在线观看| www日本高清视频| 国产欧美日韩另类一区| 国产精品久久久毛片| 香蕉视频亚洲一级| 午夜视频免费看| 在线播放你懂得| 日韩经典中文字幕| 麻豆国产尤物av尤物在线观看| 人人爽久久涩噜噜噜网站| 岛国在线免费| 未满十八勿进黄网站一区不卡| 亚洲综合激情另类小说区| 国产精品 日产精品 欧美精品| 在线播放一区二区三区| 国产 日韩 欧美 精品| 日韩加勒比系列| 另类视频一区二区三区| 国产盗摄一区二区| 日本人妖在线| 亚洲国产婷婷| 高端美女服务在线视频播放| 深爱激情综合网| 欧美图片欧美激情欧美精品| 亚洲人精品午夜射精日韩| 成年网站在线免费观看| 久久人人爽人人爽人人| 日本中文字幕有码| 天天综合网久久| 天天夜碰日日摸日日澡性色av| 国产精品盗摄一区二区三区| 亚洲电影有码| 久久国产精品高清| 国内不卡的二区三区中文字幕| 亚洲七七久久综合桃花剧情介绍| 亚洲啪啪综合av一区二区三区| 色老头久久综合| 理论视频在线| 一本大道久久加勒比香蕉| 欧美性猛交xxxx免费看久久| 日本熟妇人妻中出| 欧美成人一区二区在线| 亚洲乱码精品| 久久影院午夜论| 国产女人18水真多毛片18精品| 国产成人va亚洲电影| 亚洲色图欧美激情| 91福利国产成人精品播放| 国产精品21p| 久久五月激情| 欧美变态tickle挠乳网站| 精品视频偷偷看在线观看| 精品国产欧美日韩一区二区三区| 国产日韩v精品一区二区| 在线日韩影院| 午夜性爽视频男人的天堂| 亚洲欧美日韩网站| 99re8精品视频在线观看| 久久精品最新免费国产成人| 日本免费黄色小视频| 国产一区二区三区影院| 国产视频一二三区| 亚洲欧美日韩精品在线| 欧美成人高清视频在线观看| 欧美日韩国产区一| 国产精品爽爽ⅴa在线观看| 国产精品美女久久久免费| 99国产精品免费| 成人黄色免费电影| 日韩欧美第二区在线观看| 久久女同互慰一区二区三区| 日韩亚洲欧美一区二区| 55夜色66夜色国产精品视频| a资源在线观看| 国产精品美女一区二区三区四区| 国产精品老熟女一区二区| 久久久久观看| 看女生喷水的网站在线观看| 精品国精品国产自在久不卡| 婷婷国产在线综合| 精品99视频| 激情亚洲网站| 免费国产自久久久久三四区久久| 美女免费观看一区二区三区| 一区二区在线观看视频在线观看| 97人妻精品一区二区三区动漫| 三级毛片电影网站| 欧美精品99久久| 久久亚洲精品视频| 亚洲精品视频区| 国产69久久精品成人看| 在线看片成人| yw视频在线观看| 九九九久久久久久| 国产又粗又猛又爽又| 在线视频资源站| 久久久一区二区三区四区| 男女视频在线观看网站| 自拍自偷一区二区三区| 黄视频网站免费看| 国产成人免费在线观看| 欧美黑人欧美精品刺激| 国产成人精品免费一区二区| 九色视频成人自拍| 国产精品国产三级国产专区53| 欧美日韩精品欧美日韩精品一综合| 欧美丝袜美腿| 午夜理伦三级做爰电影| 国产精品一区免费观看| av免费看大片| 久久男人的天堂| 国产精成人品localhost| 久热国产在线| 中文乱码免费一区二区| 777国产偷窥盗摄精品视频| 亚洲精品1234| 国产男人精品视频| 99re这里只有精品6| 伊人亚洲福利一区二区三区| 国产永久免费| 欧美性高潮床叫视频| 久久精品国产99国产精品| 免费在线播放第一区高清av| 日韩人妻精品无码一区二区三区| 日本一区免费观看| 欧美日韩国产va另类| 欧美日韩国产综合视频| 欧美精品久久久久久久久| jizz欧美| 香蕉久久夜色精品国产使用方法| 麻豆国产原创| 秋霞午夜电影| 色中色综合影院手机版在线观看| 日本三级在线观看网站| 成人福利影视| 亚洲国产欧美一区二区三区丁香婷| 96sao精品视频在线观看| 欧美丰满熟妇bbbbbb| 天天综合成人网| 亚洲精品一卡二卡三卡四卡| 最新日韩中文字幕| 免费人成年激情视频在线观看| 欧美一区久久| 精品免费一区二区三区| 久久亚洲精品视频| 狠狠人妻久久久久久综合蜜桃| 国语自产在线不卡| www视频在线观看免费| 亚洲va欧美va国产综合剧情| 亚洲自拍偷拍网| 欧美在线亚洲综合一区| 国产成人福利视频| 精品国产一区二区三区不卡蜜臂| 91网在线观看| 欧美午夜性色大片在线观看| 亚洲免费毛片网站| 最近日韩中文字幕中文| 天天看天天色| 麻豆精品视频在线| 九九色在线视频| 成人在线视频你懂的| 三级欧美韩日大片在线看| 欧美精品七区| 涩涩视频网站| 日韩一区国产二区欧美三区| 久久99精品久久久久久欧洲站| 一级在线免费视频| 成人激情综合| 中文字幕第九页| 国产精品日韩高清| 免费无遮挡无码永久视频| 国产精品酒店视频| 成人午夜免费在线观看| 欧美国产精品| 污影院在线观看| 2025韩国大尺度电影| 99久久综合狠狠综合久久| 大桥未久在线播放|