`

Lucene之AttributeImpl源码简单

 
阅读更多

一、简单介绍

 

Attribute接口是一个空接口;

AttributeImpl也继承Attribute接口;

                        根据源码是:记录对象的属性,但是不包含静态属性

                        对于一些属性是Attribute是接口,然后AttributeImpl去实现接口。

                        例如:OffsetAttribute 和 OffsetAttributeImpl

 

二、简单源码分析

public abstract class AttributeImpl implements Cloneable, Attribute {

	/*
	 * 抽象有两个方法一个clean方法一个copyTo方法 但是copy方法返回是一个void?说明修改后直接改变的还是对象内容。
	 */
	public abstract void clear();

	public abstract void copyTo(AttributeImpl target);

	/*
	 * 这个方法好奇怪,下面的方法调用居然根据这个变量来处理
	 */
	public final String reflectAsString(final boolean prependAttClass) {
		/*
		 *   *StringBuild 没线程安全 效率更高   *StringBuffer 线程安全   *
		 */
		final StringBuilder buffer = new StringBuilder();
		/*
		 * AttributeReflector是一个接口里面只有一个方法。   *
		 * AttributeReflector(接口,字段属性《剔除静态的》,值);
		 */
		reflectWith(new AttributeReflector() {
			@Override
			public void reflect(Class<? extends Attribute> attClass,
					String key, Object value) {
				if (buffer.length() > 0) {
					buffer.append(',');
				}
				/*
				 * 如果是false的话类名不用添加了
				 */
				if (prependAttClass) {
					buffer.append(attClass.getName()).append('#');
				}
				/*
				 * buffer添加字符串key=对于value为空null否则就添加value
				 */
				buffer.append(key).append('=')
						.append((value == null) ? "null" : value);
			}
		});
		return buffer.toString();
	}

	public void reflectWith(AttributeReflector reflector) {
		// 得到Class也就是反射了
		final Class<? extends AttributeImpl> clazz = this.getClass();
		// 通过AttributeSource得到 从字面意思是得到所有的接口
		final LinkedList<WeakReference<Class<? extends Attribute>>> interfaces = AttributeSource
				.getAttributeInterfaces(clazz);
		// 如果没接口抛出异常
		if (interfaces.size() != 1) {
			throw new UnsupportedOperationException(
					clazz.getName()
							+ " implements more than one Attribute interface, the default reflectWith() implementation cannot handle this.");
		}
		// 下面应该是得到第一个接口?但是是为什么那?只得到第一个哪?
		final Class<? extends Attribute> interf = interfaces.getFirst().get();
		final Field[] fields = clazz.getDeclaredFields();
		try {
			for (int i = 0; i < fields.length; i++) {
				final Field f = fields[i];
				// 得到所有的属性,但是静态属性就去掉了
				if (Modifier.isStatic(f.getModifiers()))
					continue;
				f.setAccessible(true);
				reflector.reflect(interf, f.getName(), f.get(this));
			}
		} catch (IllegalAccessException e) {
			// this should never happen, because we're just accessing fields
			// from 'this'
			throw new RuntimeException(e);
		}
	}

	/*
	 * 返回一个克隆的对象
	 */
	@Override
	public AttributeImpl clone() {
		AttributeImpl clone = null;
		try {
			clone = (AttributeImpl) super.clone();
		} catch (CloneNotSupportedException e) {
			throw new RuntimeException(e); // shouldn't happen
		}
		return clone;
	}
}

 

分享到:
评论

相关推荐

    lucene.net 2.9.1 源码

    《深入剖析Lucene.NET 2.9.1:源码解析与应用开发》 Lucene.NET 2.9.1是开源搜索引擎库Lucene的.NET版本,它为.NET开发者提供了强大的全文检索和索引功能。这个版本的源码提供了一个宝贵的资源,帮助我们理解其内部...

    lucene 华电项目 源码

    《深入剖析Lucene华电项目源码》 在IT领域,搜索引擎技术是不可或缺的一部分,而Apache Lucene作为一款开源的全文检索库,被广泛应用在各种信息检索系统中。本文将结合“lucene 华电项目 源码”,深度解析Lucene的...

    lucene in action源码2

    现在我们拥有《Lucene in Action》的源码,这为我们提供了探索和学习Lucene的宝贵资源。 首先,Lucene是一个高性能、全文本搜索库,由Java编写,广泛应用于各种搜索应用场景,包括网站搜索、文档检索、日志分析等。...

    lucene3源码分析

    Lucene是Java领域内最受欢迎的全文检索框架之一,其核心功能包括文本索引和查询。在理解Lucene的工作机制之前,我们需要了解全文检索的基本原理。 - **索引构建**:这是全文检索的第一步,涉及到将文档内容转换为可...

    Lucene3.5源码jar包

    本压缩包包含的是Lucene 3.5.0版本的全部源码,对于想要深入理解Lucene工作原理、进行二次开发或者进行搜索引擎相关研究的开发者来说,是一份非常宝贵的学习资源。 Lucene 3.5.0是Lucene的一个重要版本,它在3.x...

    Lucene.Net2.3源码,最新版

    **Lucene.Net 2.3 源码详解** Lucene.Net 是 Apache Lucene 的 .NET 实现,它是一个高性能、全文本搜索库,适用于 .NET 开发者。这个版本是 2.3,是最新的版本,包含了丰富的功能和优化。通过分析其源码,我们可以...

    Lucene.Net 2.9.2源码包(有Demo)

    **Lucene.Net 2.9.2 源码包详解** Lucene.Net 是一个开源全文搜索引擎库,它是 Apache Lucene 的 .NET 版本,为 .NET 开发人员提供了强大的搜索功能。Lucene.Net 2.9.2 版本是这个项目的其中一个稳定版本,提供了对...

    Lucene学习源码.rar

    《深入剖析Lucene:从源码到实践》 Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,主要用于构建搜索引擎。它提供了一个简单但功能强大的API,使得开发者能够轻松地在应用中实现文本检索功能。Lucene...

    lucene-solr源码,编译成的idea项目源码

    本人用ant idea命令花了214分钟,35秒编译的lucene-solr源码,可以用idea打开,把项目放在D:\space\study\java\lucene-solr路径下,再用idea打开就行了

    lucene5 源码教程

    通过实践项目,如构建一个简单的搜索引擎或集成Lucene到现有应用中,可以更深入地理解其工作原理。在实践中,会遇到如数据导入、更新、删除等问题,解决这些问题有助于提升开发者的Lucene应用能力。 总结,Lucene 5...

    lucene-4.10.3源码

    《深入剖析Lucene 4.10.3源码》 Apache Lucene是一个高性能、全文检索库,它为Java开发者提供了强大的文本搜索功能。在Windows系统下,虽然官方并未直接提供源码,但通过从Linux系统下提取,我们得以一窥Lucene ...

    lucene 全包 包括源码

    在这个压缩包中,你将获得Lucene 2.3.2版本的全部源码,这将有助于深入理解其内部工作原理以及进行自定义开发。 源码分析: Lucene 的源码分为几个主要部分,包括分析(Analyzer)、索引(Index)、查询(Query)、...

    lucene in action源码

    源码的提供使得读者可以更直观地理解Lucene的工作原理,这对于学习和开发基于Lucene的搜索应用非常有帮助。以下是根据标题、描述以及压缩包中的文件名称,对Lucene相关知识点的详细解释: 1. **Apache Lucene**:...

    lucene5.0源码包

    《深入剖析Lucene 5.0源码》 Lucene是一个高性能、全文检索库,它为Java开发者提供了在应用程序中实现全文检索功能的工具。在本文中,我们将深入探讨Lucene 5.0的源码,揭示其核心设计思想与工作原理,帮助读者更好...

    Lucene In Action 2源码

    《Lucene In Action 2源码》是针对著名图书《Lucene In Action 2nd Edition》的配套代码资源,这本书是关于Apache Lucene全文搜索引擎库的一部经典之作。Lucene是一个开源的Java库,用于构建高性能、可扩展的信息...

    lucene.net完整源码

    本文将围绕“lucene.net完整源码”进行深入探讨,包括其分词机制、盘古分词的使用以及搜索关键词的高亮显示。 首先,我们来看Lucene.NET的核心——分词。在信息检索领域,分词是构建索引的基础步骤,它将文本分解...

    Lucene中文分词源码详解

    Lucene,作为一种全文搜索的辅助工具,为我们进行条件搜索,无论是像Google,Baidu之类的搜索引 擎,还是论坛中的搜索功能,还是其它C/S架构的搜索,都带来了极大的便利和比较高的效率。本文主要是利用Lucene对MS Sql...

    lucene 2.4.1源码在eclipse调试运行通过

    Lucene 2.4.1的demo模块包含了一些简单的示例程序,可以帮助我们快速了解其工作原理。例如,“SimpleTextIndexWriter”和“SimpleTextIndexReader”可以演示如何创建索引和读取索引。 1. 首先,确保已选中demo模块...

    lucene全文检索案例源码

    《深入剖析Lucene全文检索案例源码》 在信息技术领域,全文检索技术是搜索引擎的核心,而Lucene作为Java平台上的一个开源全文检索库,被广泛应用于各种搜索应用中。本篇将围绕“lucene全文检索案例源码”展开,深入...

Global site tag (gtag.js) - Google Analytics